package rhplus.gestor;

import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import rhplus.persistencia.ContaDeUtilizador;
import rhplus.persistencia.Hospital;
import rhplus.sistema.CodigoPostal;
import rhplus.sistema.Empresa;
import rhplus.sistema.Seguranca;
import rhplus.sistema.UtensiliosParaStrings;
import rhplus.utilizador.Cliente;
import rhplus.utilizador.ClienteParticular;
import rhplus.utilizador.DoencaGenerica;
import rhplus.utilizador.DoencaPassada;
import rhplus.utilizador.MembroDoAgregado;
import rhplus.utilizador.Pessoa;
import rhplus.utilizador.TratamentoPassado;
import rhplus.utilizador.Utente;

@SuppressWarnings("serial")
public class GestorDeUtentes extends HttpServlet implements Servlet {
    /*
     * (non-Java-doc)
     *
     * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request,
     *      HttpServletResponse response)
     * @Override
     */

    private boolean verificaMaiorIdade = false;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        String accao = (String) request.getParameter("accao");
        if (accao.equals(GestorDeUtentes.INSERIR_CLIENTE)) {
            inserirCliente(request, response, session);
        } else if (accao.equals(GestorDeUtentes.VERIFICAR_BI)) {
            try {
                verificaBI(request, response, session);
            } catch (Exception ex) {
                Logger.getLogger(GestorDeUtentes.class.getName()).log(Level.SEVERE, null, ex);
            }
            /* } else if (accao.equals(GestorDeUtentes.MIGRA_UTILIZADOR)) {
            try {
            migraUtilizador(request, response, session);
            } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(GestorDeUtentes.class.getName()).log(Level.SEVERE, null, ex);
            }*/
        } else if (accao.equals(GestorDeUtentes.ALTERAR_CLIENTE)) {
            alterarCliente(request, response, session);
            /*} else if (accao.equals(GestorDeUtentes.REMOVER_CLIENTE)) {
            removerCliente(request, response, session);*/
        } else if (accao.equals(GestorDeUtentes.VISUALIZAR_CLIENTE)) {
            visualizarCliente(request, response, session);
        } else if (accao.equals(GestorDeUtentes.ADICIONAR_MEMBRO_DO_AGREGADO)) {
            adicionarMembroDoAgregado(request, response, session);
        } else if (accao.equals(GestorDeUtentes.ALTERAR_MEMBRO_DO_AGREGADO)) {
            alterarMembroDoAgregado(request, response, session);
        } /*else if (accao.equals(GestorDeUtentes.REMOVER_MEMBRO_DO_AGREGADO)) {
        removerMembroDoAgregado(request, response, session);
        } else if (accao.equals(GestorDeUtentes.REMOVER_MEMBROS_DO_AGREGADO)) {
        removerMembrosDoAgregado(request, response, session);
        } */ else if (accao.equals(GestorDeUtentes.VISUALIZAR_MEMBRO_DO_AGREGADO)) {
            visualizarMembroDoAgregado(request, response, session);
            /*} else if (accao.equals(GestorDeUtentes.ADICIONAR_DOENCA_GENERICA)) {
            adicionarDoencaGenerica(request, response, session);
            } else if (accao.equals(GestorDeUtentes.ALTERAR_DOENCA_GENERICA)) {
            alterarDoencaGenerica(request, response, session);
            } else if (accao.equals(GestorDeUtentes.REMOVER_DOENCA_GENERICA)) {
            removerDoencaGenerica(request, response, session);
            } else if (accao.equals(GestorDeUtentes.VISUALIZAR_DOENCA_GENERICA)) {
            visualizarDoencaGenerica(request, response, session);*/
        } else if (accao.equals(GestorDeUtentes.ADICIONAR_DOENCA_PASSADA)) {
            adicionarDoencaPassada(request, response, session);
        } else if (accao.equals(GestorDeUtentes.ALTERAR_DOENCA_PASSADA)) {
            alterarDoencaPassada(request, response, session);
            /*} else if (accao.equals(GestorDeUtentes.REMOVER_DOENCA_PASSADA)) {
            removerDoencaPassada(request, response, session);
            } else if (accao.equals(GestorDeUtentes.REMOVER_DOENCAS_PASSADAS)) {
            removerDoencasPassadas(request, response, session);
            } else if (accao.equals(GestorDeUtentes.VISUALIZAR_DOENCA_PASSADA)) {
            visualizarDoencaPassada(request, response, session);*/
        } else if (accao.equals(GestorDeUtentes.ADICIONAR_TRATAMENTO_PASSADO)) {
            adicionarTratamentoPassado(request, response, session);
        } else if (accao.equals(GestorDeUtentes.ALTERAR_TRATAMENTO_PASSADO)) {
            alterarTratamentoPassado(request, response, session);
        } else if (accao.equals(GestorDeUtentes.REMOVER_TRATAMENTO_PASSADO)) {
            removerTratamentoPassado(request, response, session);
        } else if (accao.equals(GestorDeUtentes.REMOVER_TRATAMENTOS_PASSADOS)) {
            removerTratamentosPassados(request, response, session);
        } else if (accao.equals(GestorDeUtentes.VISUALIZAR_TRATAMENTO_PASSADO)) {
            visualizarTratamentoPassado(request, response, session);
        } else if (accao.equals(GestorDeUtentes.PESQUISAR_UTENTE)) {
            pesquisarUtente(request, response, session);
        } else if (accao.equals(GestorDeUtentes.REMOVER_HISTORICO_INTERNAMENTO)) {
            removerHistoricoInternamento(request, response, session);
        } else if (accao.equals(GestorDeUtentes.PESQUISAR_COLABORADOR)) {
            pesquisarColaborador(request, response, session);
        } else if (accao.equals(GestorDeUtentes.REMOVER_MENSAGEM)) {
            removeMensagem(request, response, session);
        } else if (accao.equals(GestorDeUtentes.MIGRA_MEMBRO_DO_AGREGADO)) {
            try {
                migraMembroDoAgregado(request, response, session);
            } catch (NoSuchAlgorithmException ex) {
                Logger.getLogger(GestorDeUtentes.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {
            IllegalArgumentException illegal_argument_exception = new IllegalArgumentException();
            session.setAttribute("excepcao", illegal_argument_exception.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }


    /*
     * (non-Java-doc)
     *
     * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request,
     *      HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    public void verificaBI(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException, Exception {
        Hashtable<String, String> erros = new Hashtable<String, String>();
        String bi = request.getParameter("bi");
        session.setAttribute("bi", bi);


        //verifica erros no formato do BI
        try {
            new Integer(bi);
        } catch (NumberFormatException ex) {
            ex.printStackTrace();
            if (bi.isEmpty()) {
                erros.put("empty", "Deve inserir um numero de BI.");
            } else {
                erros.put("numberFormat", "O BI inserido nao e valido");
            }
        }


        //verifica se algum membro do agregado tem este n� BI
        if (erros.isEmpty()) {
            if (Pessoa.existeBI(Integer.parseInt(bi))) {
                Long id = Pessoa.devolveIdPessoaPorBI(Integer.parseInt(bi));
                Pessoa p = Pessoa.devolve(id);
                int idade = UtensiliosParaDatas.dateDiff((p.getDataDeNascimento()).getYear() + 1900, UtensiliosParaDatas.agora().getYear() + 1900);
                if (idade >= 18 && !Pessoa.temContaDeUtilzador(id)) {
                    //existe BI
                    //adaptar os registos para criar um novo cliente
                    session.setAttribute("id_pessoa", p.getIdPessoa());
                    response.sendRedirect("/registo_membro.jsp");
                } else if (idade < 18) {
                    erros.put("idade", "O utente é menor que 18 anos.");
                    session.setAttribute("erros", erros);
                    response.sendRedirect("/pre_registo.jsp");
                } else {
                    erros.put("idade", "O BI introduzido já existe. Se tem a certeza de que inseriu o BI correctamente e se n�o est� registado como cliente, por favor, contacte o administrador.");
                    session.setAttribute("erros", erros);
                    response.sendRedirect("/pre_registo.jsp");
                }
                //nao existe BI
            } else {
                // registo novo
                response.sendRedirect("Gestor?gestor=gestor_de_utentes&accao=inserir_cliente&sub_accao=primeira");
            }
        } else {
            session.setAttribute("erros", erros);
            response.sendRedirect("/pre_registo.jsp");
        }
    }


    /*public void migraUtilizador(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException, NoSuchAlgorithmException {
    Hashtable<String, String> erros = new Hashtable<String, String>();
    try {
    Long id_pessoa = Long.parseLong(request.getParameter("id_pessoa"));
    if (dadosEstaoValidos(request, GestorDeUtentes.MIGRA_UTILIZADOR)) {
    ContaDeUtilizador.migraUtilizador(id_pessoa, request.getParameter("username"), request.getParameter("password"));
    session.setAttribute("username", request.getParameter("username"));
    session.setAttribute("success", "A sua conta foi migrada de um membro de agregado para um cliente individual.<br>Podera agora efectuar o login");
    } else {
    session.setAttribute("erros", devolveTabelaDeErrosParaCriarContaDeUtilizador(request));
    }
    } catch (InstantiationException ex) {
    Logger.getLogger(GestorDeUtentes.class.getName()).log(Level.SEVERE, null, ex);
    } catch (ClassNotFoundException ex) {
    Logger.getLogger(GestorDeUtentes.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
    Logger.getLogger(GestorDeUtentes.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
    Logger.getLogger(GestorDeUtentes.class.getName()).log(Level.SEVERE, null, ex);
    }
    response.sendRedirect("/registo_membro.jsp");
    }*/
    public void inserirCliente(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {
            String sub_accao = request.getParameter("sub_accao");


            if (sub_accao != null && sub_accao.equals("primeira")) {
                session.setAttribute("empresas", Empresa.devolveTodas());
                response.sendRedirect("/registo.jsp");
            } else if (sub_accao != null && sub_accao.equals("segunda")) {
                if (dadosEstaoValidos(request, GestorDeUtentes.INSERIR_CLIENTE)) {     
                    //vai inserir na tabela pessoa, contaDeUtilizador, utente e cliente
                    ClienteParticular.insere(populaTabelaInserirCliente(request), populaTabelaContaDeUtilizador(request));

                    session.removeAttribute("bi");
                    session.setAttribute("erros", null);


                    session.setAttribute("msg_sucesso", "Registo efectuado com sucesso.");
                    session.setAttribute("nome_pagina_link", "de login");
                    session.setAttribute("pagina_link", "/login.jsp");
                    response.sendRedirect("/mostra_sucesso.jsp");


                } else {
                    session.setAttribute("erros", devolveTabelaDeErrosParaInserirCliente(request));


                    // Propaga dados, previamente inseridos, pela sessao
                    session.setAttribute("nome", request.getParameter("nome"));
                    session.setAttribute("sexo", request.getParameter("sexo"));
                    session.setAttribute("bi", request.getParameter("bi"));
                    session.setAttribute("data_de_nascimento_ano", request.getParameter("data_de_nascimento_ano"));
                    session.setAttribute("data_de_nascimento_mes", request.getParameter("data_de_nascimento_mes"));
                    session.setAttribute("data_de_nascimento_dia", request.getParameter("data_de_nascimento_dia"));
                    session.setAttribute("nif", request.getParameter("nif"));
                    session.setAttribute("email", request.getParameter("email"));
                    session.setAttribute("telefone", request.getParameter("telefone"));
                    session.setAttribute("telemovel", request.getParameter("telemovel"));
                    session.setAttribute("morada", request.getParameter("morada"));
                    session.setAttribute("prefixo_codigo_postal", request.getParameter("prefixo_codigo_postal"));
                    session.setAttribute("sufixo_codigo_postal", request.getParameter("sufixo_codigo_postal"));
                    session.setAttribute("localidade", request.getParameter("localidade"));
                    session.setAttribute("grupo_sanguineo", request.getParameter("grupo_sanguineo"));
                    session.setAttribute("username", request.getParameter("username"));
                    session.setAttribute("tipo", request.getParameter("tipo"));
                    session.setAttribute("id_empresa", request.getParameter("id_empresa"));


                    response.sendRedirect("/registo.jsp");
                }
            } else {
                session.setAttribute("excepcao", "Url incorrecto.");
                response.sendRedirect("/mostra_erro.jsp");
            }


        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.INSERIR_CLIENTE);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");


        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.INSERIR_CLIENTE);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");


        } catch (InstantiationException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.INSERIR_CLIENTE);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");


        } catch (IllegalAccessException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.INSERIR_CLIENTE);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");


        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.INSERIR_CLIENTE);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");


        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.INSERIR_CLIENTE);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");


        }
    }

    public void alterarCliente(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {
            String sub_accao = request.getParameter("sub_accao");


            if (sub_accao != null && sub_accao.equals("primeira")) {


                Long id_pessoa = Long.parseLong(request.getParameter("id"));


                Pessoa pessoa = null;
                if (Pessoa.temContaDeUtilzador(id_pessoa)) {
                    pessoa = ClienteParticular.devolve(id_pessoa);
                } else {
                    pessoa = MembroDoAgregado.devolve(id_pessoa);
                }


                session.setAttribute("id_pessoa", id_pessoa);


                // Propaga dados, previamente inseridos, pela sessao
                session.setAttribute("nome", pessoa.getNome());
                session.setAttribute("sexo", String.valueOf(pessoa.getSexo()));
                session.setAttribute("bi", pessoa.getBI());
                session.setAttribute("data_de_nascimento_ano", UtensiliosParaDatas.devolveAnoDaData(pessoa.getDataDeNascimento()));
                session.setAttribute("data_de_nascimento_mes", UtensiliosParaDatas.devolveMesDaData(pessoa.getDataDeNascimento()));
                session.setAttribute("data_de_nascimento_dia", UtensiliosParaDatas.devolveDiaDaData(pessoa.getDataDeNascimento()));
                session.setAttribute("nif", String.valueOf(pessoa.getNIF()));
                session.setAttribute("email", pessoa.getEmail());
                session.setAttribute("telefone", String.valueOf(pessoa.getTelefone()));
                session.setAttribute("telemovel", String.valueOf(pessoa.getTelemovel()));
                session.setAttribute("morada", pessoa.getMorada());
                Long id_cp = pessoa.getCodigoPostal();
                session.setAttribute("prefixo_codigo_postal", String.valueOf(CodigoPostal.devolve(id_cp).getPrefixo()));
                session.setAttribute("sufixo_codigo_postal", String.valueOf(CodigoPostal.devolve(id_cp).getSufixo()));
                session.setAttribute("localidade", CodigoPostal.devolve(id_cp).getLocalidade());
                session.setAttribute("grupo_sanguineo", pessoa.getGrupoSanguineo());


                if (Pessoa.temContaDeUtilzador(id_pessoa)) {
                    session.setAttribute("username", ContaDeUtilizador.devolveUsername(pessoa.getIdPessoa()));
                } else {
                    session.setAttribute("e_membro_agregado", "");
                }
                Pessoa cliente_particular = (Pessoa) session.getAttribute("utilizador");
                session.setAttribute("tipo", "particular");
                session.setAttribute("numero_de_cliente", Utente.devolveIdUtentePorIdPessoa(cliente_particular.getIdPessoa()));


                response.sendRedirect("/altera_registo.jsp");
            } else if (sub_accao != null && sub_accao.equals("segunda")) {
                verificaMaiorIdade = true;
                if (dadosEstaoValidos(request, GestorDeUtentes.ALTERAR_CLIENTE)) {
                    Pessoa p = populaTabelaInserirPessoa(request);
                    Long id = (Long) session.getAttribute("id_pessoa");
                    p.setID(id);
                    Pessoa.altera(p);

                    // Trata da conta do utilizador caso a password seja
                    // alterada
                    if (session.getAttribute("e_membro_agregado") == null) {
                        String password = request.getParameter("password");
                        if (password != null && !password.equals("")) {
                            String username = (String) session.getAttribute("username");
                            String hash_password = Seguranca.converteParaMD5(password);
                            ContaDeUtilizador.alteraPassword(username, hash_password);
                        }
                    }
                    session.setAttribute("erros", null);
                    session.removeAttribute("e_membro_agregado");


                    session.setAttribute("msg_sucesso", "Dados alterados com sucesso.");
                    session.setAttribute("nome_pagina_link", "dos dados pessoais");
                    session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + request.getParameter("id"));
                    response.sendRedirect("/mostra_sucesso.jsp");


                } else {
                    session.setAttribute("erros", devolveTabelaDeErrosParaAlterarCliente(request));


                    // Propaga dados, previamente inseridos, pela sessao
                    session.setAttribute("nome", request.getParameter("nome"));
                    session.setAttribute("sexo", request.getParameter("sexo"));
                    session.setAttribute("bi", request.getParameter("bi"));
                    session.setAttribute("data_de_nascimento_ano", request.getParameter("data_de_nascimento_ano"));
                    session.setAttribute("data_de_nascimento_mes", request.getParameter("data_de_nascimento_mes"));
                    session.setAttribute("data_de_nascimento_dia", request.getParameter("data_de_nascimento_dia"));
                    session.setAttribute("nif", request.getParameter("nif"));
                    session.setAttribute("email", request.getParameter("email"));
                    session.setAttribute("telefone", request.getParameter("telefone"));
                    session.setAttribute("telemovel", request.getParameter("telemovel"));
                    session.setAttribute("morada", request.getParameter("morada"));
                    session.setAttribute("prefixo_codigo_postal", request.getParameter("prefixo_codigo_postal"));
                    session.setAttribute("sufixo_codigo_postal", request.getParameter("sufixo_codigo_postal"));
                    session.setAttribute("localidade", request.getParameter("localidade"));
                    session.setAttribute("grupo_sanguineo", request.getParameter("grupo_sanguineo"));


                    response.sendRedirect("/altera_registo.jsp");
                }
            } else {
                session.setAttribute("excepcao", "Url incorrecto.");
                response.sendRedirect("/mostra_erro.jsp");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_CLIENTE);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");


        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_CLIENTE);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");


        } catch (InstantiationException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_CLIENTE);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");


        } catch (IllegalAccessException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_CLIENTE);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");


        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_CLIENTE);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");


        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_CLIENTE);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");


        }
    }
    /*
    public void removerCliente(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
    try {
    Long id_cliente = Long.parseLong(request.getParameter("id_cliente"));
    Cliente.remove(id_cliente);


    } catch (SQLException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_CLIENTE);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");


    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_CLIENTE);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (InstantiationException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_CLIENTE);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_CLIENTE);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    }


    }
     */

    public void visualizarCliente(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {

        try {
            Long id_pessoa = Long.parseLong(request.getParameter("id"));
            boolean tem_conta = Pessoa.temContaDeUtilzador(id_pessoa);

            Pessoa pessoa = null;
            if (tem_conta) {
                pessoa = ClienteParticular.devolve(id_pessoa);
            } else {
                pessoa = MembroDoAgregado.devolve(id_pessoa);
            }

            session.removeAttribute("pessoa");
            session.setAttribute("id_pessoa", id_pessoa);
            session.setAttribute("pessoa", pessoa);

            if (tem_conta) {
                session.setAttribute("username", ContaDeUtilizador.devolveUsername(pessoa.getIdPessoa()));
            }

            if (tem_conta) {
                session.setAttribute("particular", Utente.devolvePorIdPessoa(id_pessoa));
                session.setAttribute("tipo", "particular");
                session.removeAttribute("is_membro_agregado");
            } else {
                Pessoa membro_do_agregado = MembroDoAgregado.devolve(id_pessoa);
                session.setAttribute("membro", membro_do_agregado);
                session.setAttribute("is_membro_agregado", "");
            }
            LinkedList<TratamentoPassado> lista_tratamentos = TratamentoPassado.devolvePorIdPessoa(id_pessoa);
            session.setAttribute("lista_tratamentos", lista_tratamentos);

            LinkedList<DoencaPassada> lista_doencas = DoencaPassada.devolvePorIdPessoa(id_pessoa);
            session.setAttribute("lista_doencas_passadas", lista_doencas);



            //tempor�rio - o metodo devia estar nos utentes
           /*session.setAttribute("lista_historico_internamentos", *///Hospital.devolveHistoricoInternamentos(id_pessoa);
           /* session.setAttribute("lista_fichas_medicas", */ //Servico.devolveFichasParaLink(id_pessoa);

            response.sendRedirect("/mostra_perfil.jsp");

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.VISUALIZAR_CLIENTE);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }


    /* MEMBRO DO AGREGADO *///
    public void adicionarMembroDoAgregado(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {

        try {

            String sub_accao = (String) request.getParameter("sub_accao");

            if (sub_accao != null && sub_accao.equals("primeira")) {

                Long id_pessoa = (Long) session.getAttribute("id_pessoa");
                session.setAttribute("id_titular", id_pessoa);
                response.sendRedirect("/adiciona_membro_do_agregado.jsp");

            } else if (sub_accao != null && sub_accao.equals("segunda")) {

                if (dadosEstaoValidos(request, GestorDeUtentes.ADICIONAR_MEMBRO_DO_AGREGADO)) {

                    Pessoa membro_do_agregado = populaTabelaInserirPessoa(request);
                    // Descobre id titular para meter na tabela
                    Long id_titular = (Long) session.getAttribute("id_titular");

                    String perfil = ContaDeUtilizador.devolvePerfil(id_titular);

                    if (perfil.equals("particular")) {
//                        Pessoa cliente_particular = Cliente.devolvePorId(id_titular);
//                          cliente_particular.adicionaMembroDoAgregado(membro_do_agregado, id_titular);

                        Cliente.adicionaMembroDoAgregado(membro_do_agregado, id_titular);

//                    } else // Cliente.EMPRESA
//                    {
//                        //  ClienteEmpresa cliente_empresa = ClienteEmpresa.devolve(id_titular);
//                        // cliente_empresa.adicionaMembroDoAgregado(membro_do_agregado);
                    }

                    session.setAttribute("erros", null);

                    session.setAttribute("msg_sucesso", "Membro do agregado inserido com sucesso.");
                    session.setAttribute("nome_pagina_link", "dos dados pessoais");
                    session.setAttribute("pagina_link", "/Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_titular);
                    response.sendRedirect("/mostra_sucesso.jsp");

                } else {
                    session.setAttribute("erros", devolveTabelaDeErrosParaInserirMembroAgregado(request));

                    // Propaga dados, previamente inseridos, pela sessao
                    session.setAttribute("nome", request.getParameter("nome"));
                    session.setAttribute("sexo", request.getParameter("sexo"));
                    session.setAttribute("bi", request.getParameter("bi"));
                    session.setAttribute("data_de_nascimento_ano", request.getParameter("data_de_nascimento_ano"));
                    session.setAttribute("data_de_nascimento_mes", request.getParameter("data_de_nascimento_mes"));
                    session.setAttribute("data_de_nascimento_dia", request.getParameter("data_de_nascimento_dia"));
                    session.setAttribute("nif", request.getParameter("nif"));
                    session.setAttribute("email", request.getParameter("email"));
                    session.setAttribute("telefone", request.getParameter("telefone"));
                    session.setAttribute("telemovel", request.getParameter("telemovel"));
                    session.setAttribute("morada", request.getParameter("morada"));
                    session.setAttribute("prefixo_codigo_postal", request.getParameter("prefixo_codigo_postal"));
                    session.setAttribute("sufixo_codigo_postal", request.getParameter("sufixo_codigo_postal"));
                    session.setAttribute("localidade", request.getParameter("localidade"));
                    session.setAttribute("grupo_sanguineo", request.getParameter("grupo_sanguineo"));

                    response.sendRedirect("/adiciona_membro_do_agregado.jsp");
                }
            } else {
                session.setAttribute("excepcao", "Url incorrecto.");
                response.sendRedirect("/mostra_erro.jsp");
            }

        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_MEMBRO_DO_AGREGADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_MEMBRO_DO_AGREGADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (InstantiationException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_MEMBRO_DO_AGREGADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_MEMBRO_DO_AGREGADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_MEMBRO_DO_AGREGADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_MEMBRO_DO_AGREGADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    public void alterarMembroDoAgregado(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {
            String sub_accao = (String) request.getParameter("sub_accao");
            if (sub_accao != null && sub_accao.equals("primeira")) {
                Long id_pessoa = Long.parseLong(request.getParameter("id_utente"));
                Pessoa membro_do_agregado = MembroDoAgregado.devolve(id_pessoa);

                Long id_titular = Long.parseLong(request.getParameter("id_titular"));
                session.setAttribute("id_titular", id_titular);

                // Propaga dados, previamente inseridos, pela sessao
                session.setAttribute("id_pessoa", id_pessoa);
                session.setAttribute("nome", membro_do_agregado.getNome());
                session.setAttribute("sexo", String.valueOf(membro_do_agregado.getSexo()));
                session.setAttribute("bi", membro_do_agregado.getBI());
                session.setAttribute("data_de_nascimento_ano", UtensiliosParaDatas.devolveAnoDaData(membro_do_agregado.getDataDeNascimento()));
                session.setAttribute("data_de_nascimento_mes", UtensiliosParaDatas.devolveMesDaData(membro_do_agregado.getDataDeNascimento()));
                session.setAttribute("data_de_nascimento_dia", UtensiliosParaDatas.devolveDiaDaData(membro_do_agregado.getDataDeNascimento()));
                session.setAttribute("nif", String.valueOf(membro_do_agregado.getNIF()));
                session.setAttribute("email", membro_do_agregado.getEmail());
                session.setAttribute("telefone", String.valueOf(membro_do_agregado.getTelefone()));
                session.setAttribute("telemovel", String.valueOf(membro_do_agregado.getTelemovel()));
                session.setAttribute("morada", membro_do_agregado.getMorada());
                session.setAttribute("prefixo_codigo_postal", request.getParameter("prefixo_codigo_postal"));
                session.setAttribute("sufixo_codigo_postal", request.getParameter("sufixo_codigo_postal"));
                session.setAttribute("localidade", request.getParameter("localidade"));
                session.setAttribute("grupo_sanguineo", membro_do_agregado.getGrupoSanguineo());
                //session.setAttribute("username", ContaDeUtilizador.devolveUsername(membro_do_agregado.getIdPessoa()));


                response.sendRedirect("/altera_membro_do_agregado.jsp");
            } else if (sub_accao != null && sub_accao.equals("segunda")) {
                verificaMaiorIdade = false;
                if (dadosEstaoValidos(request, GestorDeUtentes.ALTERAR_MEMBRO_DO_AGREGADO)) {

                    // Ir buscar o objecto do cliente a variavel de sessao
                    // utilizador
                    Long id_pessoa = Long.parseLong(request.getParameter("id_pessoa"));

                    Pessoa membro_do_agregado = MembroDoAgregado.devolve(id_pessoa);

                    // Verificar se o codigo postal existe
                    // Senao existir inserir na base de dados
                    int prefixo_codigo_postal = Integer.parseInt(request.getParameter("prefixo_codigo_postal"));
                    int sufixo_codigo_postal = Integer.parseInt(request.getParameter("sufixo_codigo_postal"));
                    if (!CodigoPostal.existe(prefixo_codigo_postal, sufixo_codigo_postal)) {
                        CodigoPostal.insere(populaTabelaCodigoPostal(request));
                    }

                    membro_do_agregado.setNome(request.getParameter("nome"));
                    membro_do_agregado.setSexo(request.getParameter("sexo").charAt(0));
                    membro_do_agregado.setBI(Integer.parseInt(request.getParameter("bi")));
                    membro_do_agregado.setDataDeNascimento(UtensiliosParaDatas.devolveData(Integer.parseInt((String) request.getParameter("data_de_nascimento_ano")), Integer.parseInt((String) request.getParameter("data_de_nascimento_mes")),
                            Integer.parseInt((String) request.getParameter("data_de_nascimento_dia"))));
                    membro_do_agregado.setNIF(Integer.parseInt(request.getParameter("nif")));
                    membro_do_agregado.setEmail(request.getParameter("email"));
                    membro_do_agregado.setTelefone(Integer.parseInt(request.getParameter("telefone")));
                    membro_do_agregado.setTelemovel(Integer.parseInt(request.getParameter("telemovel")));
                    membro_do_agregado.setMorada(request.getParameter("morada"));
                    Long id_codigo_postal = CodigoPostal.devolve(prefixo_codigo_postal, sufixo_codigo_postal).getIdCodigoPostal();
                    membro_do_agregado.setCodigoPostal(id_codigo_postal);
                    membro_do_agregado.setGrupoSanguineo(request.getParameter("grupo_sanguineo"));

                    // Trata da conta do utilizador caso a password seja
                    // alterada
                    String password = (String) request.getParameter("password");
                    if (password != null && !password.equals("")) {
                        String username = (String) session.getAttribute("username");
                        String hash_password = Seguranca.converteParaMD5(password);
                        ContaDeUtilizador.alteraPassword(username, hash_password);
                    }

                    session.setAttribute("erros", null);

                    //response.sendRedirect("/Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_titular);
                    session.setAttribute("msg_sucesso", "Dados alterados com sucesso.");
                    session.setAttribute("nome_pagina_link", "dos dados pessoais do agregado");
                    session.setAttribute("pagina_link", "/Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_pessoa);
                    response.sendRedirect("/mostra_sucesso.jsp");

                } else {
                    session.setAttribute("erros", devolveTabelaDeErrosParaInserirCliente(request));

                    // Propaga dados, previamente inseridos, pela sessao
                    session.setAttribute("nome", request.getParameter("nome"));
                    session.setAttribute("sexo", request.getParameter("sexo"));
                    session.setAttribute("bi", request.getParameter("bi"));
                    session.setAttribute("data_de_nascimento_ano", request.getParameter("data_de_nascimento_ano"));
                    session.setAttribute("data_de_nascimento_mes", request.getParameter("data_de_nascimento_mes"));
                    session.setAttribute("data_de_nascimento_dia", request.getParameter("data_de_nascimento_dia"));
                    session.setAttribute("nif", request.getParameter("nif"));
                    session.setAttribute("email", request.getParameter("email"));
                    session.setAttribute("telefone", request.getParameter("telefone"));
                    session.setAttribute("telemovel", request.getParameter("telemovel"));
                    session.setAttribute("morada", request.getParameter("morada"));
                    session.setAttribute("prefixo_codigo_postal", request.getParameter("prefixo_codigo_postal"));
                    session.setAttribute("sufixo_codigo_postal", request.getParameter("sufixo_codigo_postal"));
                    session.setAttribute("localidade", request.getParameter("localidade"));
                    session.setAttribute("grupo_sanguineo", request.getParameter("grupo_sanguineo"));


                    response.sendRedirect("/altera_membro_do_agregado.jsp");
                }
            } else {
                session.setAttribute("excepcao", "Url incorrecto.");
                response.sendRedirect("/mostra_erro.jsp");
            }


        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_MEMBRO_DO_AGREGADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_MEMBRO_DO_AGREGADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (InstantiationException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_MEMBRO_DO_AGREGADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_MEMBRO_DO_AGREGADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_MEMBRO_DO_AGREGADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_MEMBRO_DO_AGREGADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }


    }

    /*

    public void removerMembroDoAgregado(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws SQLException,
    ClassNotFoundException, InstantiationException, IllegalAccessException {
    try {
    int id_membro_do_agregado = Integer.parseInt((String) request.getParameter("id_utente"));
    Long id_titular = Long.parseLong(request.getParameter("id_titular"));


    Pessoa cliente = null;
    String perfil = ContaDeUtilizador.devolvePerfil(id_titular);
    if (perfil.equals("particular")) {
    cliente = ClienteParticular.devolve(id_titular);
    } /*else if (perfil.equals("cliente_empresa")) {
    cliente = ClienteEmpresa.devolve(id_titular);
    }*/
//            cliente.removeMembroDoAGregado(id_membro_do_agregado);
/*
    session.setAttribute("msg_sucesso", "Membro do agregado removido com sucesso.");
    session.setAttribute("nome_pagina_link", "dos dados pessoais");
    session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_titular);
    response.sendRedirect("/mostra_sucesso.jsp");


    } catch (SQLException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_MEMBRO_DO_AGREGADO);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_MEMBRO_DO_AGREGADO);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (InstantiationException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_MEMBRO_DO_AGREGADO);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_MEMBRO_DO_AGREGADO);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (IOException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_MEMBRO_DO_AGREGADO);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    }
    }

    public void removerMembrosDoAgregado(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
    try {


    String[] ids_membro_do_agregado_a_remover = request.getParameterValues("membros_do_agregado");
    Long id_titular = Long.parseLong(request.getParameter("id_titular"));


    if (ids_membro_do_agregado_a_remover != null) {
    for (String membro_do_agregado_string : ids_membro_do_agregado_a_remover) {
    long id_membro_do_agregado = Integer.parseInt(membro_do_agregado_string);


    Pessoa cliente = null;
    String perfil = ContaDeUtilizador.devolvePerfil(id_titular);
    if (perfil.equals("particular")) {
    cliente = ClienteParticular.devolve(id_titular);
    } /*else if (perfil.equals("cliente_empresa")) {
    cliente = ClienteEmpresa.devolve(id_titular);
    }*/
    /*
    cliente.removeMembroDoAGregado(id_membro_do_agregado);

    //ContaDeUtilizador.remove(ContaDeUtilizador.devolveUsername(id_membro_do_agregado));

    }
    }
    //response.sendRedirect("Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_titular);
    session.setAttribute("msg_sucesso", "Membros do agregado removidos com sucesso.");
    session.setAttribute("nome_pagina_link", "dos dados pessoais");
    session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_titular);
    response.sendRedirect("/mostra_sucesso.jsp");

    } catch (SQLException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_MEMBROS_DO_AGREGADO);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_MEMBROS_DO_AGREGADO);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (InstantiationException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_MEMBROS_DO_AGREGADO);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_MEMBROS_DO_AGREGADO);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (IOException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_MEMBROS_DO_AGREGADO);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    }
    }*/
    public void visualizarMembroDoAgregado(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {

            Long id_membro = Long.parseLong(request.getParameter("id_membro"));
            Long id_titular = Long.parseLong(request.getParameter("titular"));


            session.setAttribute("id_pessoa", id_membro);
            session.setAttribute("id_titular", id_titular);

            session.removeAttribute("id_utente_hahaha");
            String id_pessoa_em_string = "" + id_membro;

            System.out.println("%%%%%%%%%% id_pessoa a pesquisar: " + id_membro);

            session.setAttribute("id_utente_hahaha", id_pessoa_em_string);

            //String perfil = ContaDeUtilizador.devolvePerfil(id_pessoa);
            Pessoa membro_do_agregado = MembroDoAgregado.devolve(id_membro);

            session.setAttribute("pessoa", membro_do_agregado);
            session.setAttribute("membro", membro_do_agregado);
            //session.setAttribute("perfil", perfil);
            //session.setAttribute("username", ContaDeUtilizador.devolveUsername(membro_do_agregado.getIdPessoa()));
            session.setAttribute("is_membro_agregado", "");
            //  session.setAttribute("lista_historico_internamentos", Hospital.devolveHistoricoInternamentos(id_pessoa));
            //  session.setAttribute("lista_fichas_medicas", Servico.devolveFichasParaLink(id_pessoa));
            response.sendRedirect("/mostra_perfil.jsp");

//        } catch (SQLException e) {
//            e.printStackTrace();
//            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.VISUALIZAR_MEMBRO_DO_AGREGADO);
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.VISUALIZAR_MEMBRO_DO_AGREGADO);
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (InstantiationException e) {
//            e.printStackTrace();
//            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.VISUALIZAR_MEMBRO_DO_AGREGADO);
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IllegalAccessException e) {
//            e.printStackTrace();
//            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.VISUALIZAR_MEMBRO_DO_AGREGADO);
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.VISUALIZAR_MEMBRO_DO_AGREGADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    private Pessoa populaTabelaInserirPessoa(final HttpServletRequest request) throws NoSuchAlgorithmException {

        String nome = request.getParameter("nome");
        char sexo = request.getParameter("sexo").charAt(0);
        int bi = Integer.parseInt(request.getParameter("bi"));

        // Data de Nascimento
        Date data = UtensiliosParaDatas.devolveDataEmDate(UtensiliosParaDatas.devolveDataEmString(Integer.parseInt(request.getParameter("data_de_nascimento_ano")),
                Integer.parseInt(request.getParameter("data_de_nascimento_mes")),
                Integer.parseInt(request.getParameter("data_de_nascimento_dia"))));

        int nif = Integer.parseInt(request.getParameter("nif"));
        String email = request.getParameter("email");
        int telefone = Integer.parseInt(request.getParameter("telefone"));
        int telemovel = Integer.parseInt(request.getParameter("telemovel"));
        String morada = request.getParameter("morada");
        String sangue = request.getParameter("grupo_sanguineo");

        int prefixo_codigo_postal = Integer.parseInt(request.getParameter("prefixo_codigo_postal"));
        int sufixo_codigo_postal = Integer.parseInt(request.getParameter("sufixo_codigo_postal"));
        if (!CodigoPostal.existe(prefixo_codigo_postal, sufixo_codigo_postal)) {
            CodigoPostal.insere(populaTabelaCodigoPostal(request));
        }

        Long codigo = CodigoPostal.devolve(prefixo_codigo_postal, sufixo_codigo_postal).getIdCodigoPostal();

        return new Pessoa(nome, sexo, bi, data, nif, email, telefone, telemovel, morada, sangue, codigo);
    }

    private Pessoa populaTabelaInserirCliente(final HttpServletRequest request) throws NoSuchAlgorithmException {

        String nome = request.getParameter("nome");
        char sexo = request.getParameter("sexo").charAt(0);
        int bi = Integer.parseInt(request.getParameter("bi"));
        // Data de Nascimento
        int dia = Integer.parseInt(request.getParameter("data_de_nascimento_dia"));
        int mes = Integer.parseInt(request.getParameter("data_de_nascimento_mes"));
        int ano = Integer.parseInt(request.getParameter("data_de_nascimento_ano"));
        Date data = UtensiliosParaDatas.devolveData(ano, mes, dia);
        int nif = Integer.parseInt(request.getParameter("nif"));
        String email = request.getParameter("email");
        int telefone = Integer.parseInt(request.getParameter("telefone"));
        int telemovel = Integer.parseInt(request.getParameter("telemovel"));
        String morada = request.getParameter("morada");
        String sangue = request.getParameter("grupo_sanguineo");

        // Verificar se o codigo postal existe
        // Se nao existir inserir na base de dados
        int prefixo_codigo_postal = populaTabelaCodigoPostal(request).getPrefixo();
        int sufixo_codigo_postal = populaTabelaCodigoPostal(request).getSufixo();
        if (!CodigoPostal.existe(prefixo_codigo_postal, sufixo_codigo_postal)) {
            CodigoPostal.insere(populaTabelaCodigoPostal(request));
        }
        // ja existe o codigo postal, por isso é necessário ir buscar o id_codigo postal
        Long codigo = CodigoPostal.devolve(prefixo_codigo_postal, sufixo_codigo_postal).getIdCodigoPostal();

        String tipo = request.getParameter("tipo");

        if (tipo == null) {
            tipo = "particular";
        }
        if (tipo.equals("particular")) {
            return new Pessoa(nome, sexo, bi, data, nif, email, telefone, telemovel, morada, sangue, codigo);
        } else {
            return null;
            // A REVER POR CAUSA DO NULL
            //return new Pessoa(nome, sexo, bi, null, nif, email, telefone, telemovel, morada, sangue, codigo, telemovel, null, telemovel, telemovel);
        }

        /*dados.put("var_tipo", (String) request.getParameter("tipo"));
        dados.put("var_id_empresa", (String) request.getParameter("id_empresa"));*/

    }

    private CodigoPostal populaTabelaCodigoPostal(final HttpServletRequest request) {

        return new CodigoPostal(Integer.parseInt(request.getParameter("prefixo_codigo_postal")),
                Integer.parseInt(request.getParameter("sufixo_codigo_postal")),
                request.getParameter("localidade"));
    }

    private ContaDeUtilizador populaTabelaContaDeUtilizador(final HttpServletRequest request) throws NoSuchAlgorithmException {

        String user = request.getParameter("username");
        String password = Seguranca.converteParaMD5(request.getParameter("password"));
        String estado = "1";


        return new ContaDeUtilizador(user, password, estado);
    }

    private boolean dadosEstaoValidos(final HttpServletRequest request, final String action) throws SQLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {
        Hashtable<String, String> tabela_de_erros = devolveTabelaDeErros(request, action);
        return tabela_de_erros != null && tabela_de_erros.isEmpty();
    }

    private Hashtable<String, String> devolveTabelaDeErros(final HttpServletRequest request, final String action) throws SQLException,
            ClassNotFoundException, InstantiationException, IllegalAccessException {
        // CLIENTE
        if (action.equals(GestorDeUtentes.INSERIR_CLIENTE)) {
            return devolveTabelaDeErrosParaInserirCliente(request);
        } else if (action.equals(GestorDeUtentes.ALTERAR_CLIENTE)) {
            return devolveTabelaDeErrosParaAlterarCliente(request);
        } // MEMBRO DO AGREGADO
        else if (action.equals(GestorDeUtentes.ADICIONAR_MEMBRO_DO_AGREGADO)) {
            return devolveTabelaDeErrosParaInserirMembroAgregado(request);
        } else if (action.equals(GestorDeUtentes.ALTERAR_MEMBRO_DO_AGREGADO)) {
            return devolveTabelaDeErrosParaAlterarPessoa(request);
            // DOENCA GENERICA
       /* else if (action.equals(GestorDeUtentes.ADICIONAR_DOENCA_GENERICA)) {
            return devolveTabelaDeErrosParaInserirDoencaGenerica(request);
            } else if (action.equals(GestorDeUtentes.ALTERAR_DOENCA_GENERICA)) {
            return devolveTabelaDeErrosParaAlterarDoencaGenerica(request);*/
            // DOENCA PASSADA
        } else if (action.equals(GestorDeUtentes.ADICIONAR_DOENCA_PASSADA)) {
            return devolveTabelaDeErrosParaInserirDoencaPassada(request);
        } else if (action.equals(GestorDeUtentes.ALTERAR_DOENCA_PASSADA)) {
            return devolveTabelaDeErrosParaAlterarDoencaPassada(request);
        } // TRATAMENTO PASSADO
        else if (action.equals(GestorDeUtentes.ADICIONAR_TRATAMENTO_PASSADO)) {
            return devolveTabelaDeErrosParaInserirTratamentoPassado(request);
        } else if (action.equals(GestorDeUtentes.ALTERAR_TRATAMENTO_PASSADO)) {
            return devolveTabelaDeErrosParaAlterarTratamentoPassado(request);
        } else if (action.equals(GestorDeUtentes.MIGRA_UTILIZADOR)) {
            return devolveTabelaDeErrosParaCriarContaDeUtilizador(request);
        } else {
            return new Hashtable<String, String>();
        }
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaInserirCliente(final HttpServletRequest request) throws SQLException,
            ClassNotFoundException, InstantiationException, IllegalAccessException {

        Hashtable<String, String> tabela_de_erros = devolveTabelaDeErrosParaInserirPessoa(request);
        //ta assim pq nao temos opçao para cliente empresa
        String tipo = "particular";
        if (tipo == null || tipo.trim().equals("")) {
            tabela_de_erros.put("tipo", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!tipo.equals(Cliente.PARTICULAR) && !tipo.equals(Cliente.EMPRESA)) {
            tabela_de_erros.put("tipo", "Campo Obrigatório. Não pode estar vazio.");
        }

        if (tipo != null && tipo.equals(Cliente.EMPRESA)) {
            // Verificar ID da empresa caso seja um cliente empresa
            String id_empresa = (String) request.getParameter("id_empresa");
            if (id_empresa == null || id_empresa.trim().equals("")) {
                tabela_de_erros.put("id_empresa", "Campo Obrigatório. Não pode estar vazio.");
            }
        }

        return tabela_de_erros;
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaAlterarCliente(final HttpServletRequest request) {

        Hashtable<String, String> tabela_de_erros = devolveTabelaDeErrosParaAlterarPessoa(request);
        return tabela_de_erros;
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaInserirPessoa(final HttpServletRequest request) throws SQLException,
            ClassNotFoundException, InstantiationException, IllegalAccessException {

        Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();

        try {
            String nome = (String) request.getParameter("nome");
            if (nome == null || nome.trim().equals("")) {
                tabela_de_erros.put("nome", "Campo Obrigatório. Não pode estar vazio.");
            } else if (UtensiliosParaStrings.eApenasLetras(nome)) {
                tabela_de_erros.put("nome", "O campo nome pode apenas conter caracteres alfab�ticos.");
            }

            String sexo = (String) request.getParameter("sexo");
            if (sexo == null || sexo.trim().equals("")) {
                tabela_de_erros.put("sexo", "Campo Obrigatório. Não pode estar vazio.");
            } else if (!(sexo.trim().equals("M") || sexo.trim().equals("F"))) {
                tabela_de_erros.put("sexo", "Valor inválido. O campo sexo apenas poderá assumir o valor \"M\" ou \"F\".");
            }

            String bi = (String) request.getParameter("bi");
            if (bi == null || bi.trim().equals("")) {
                tabela_de_erros.put("bi", "Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(bi)) {
                tabela_de_erros.put("bi", "O campo BI deverá ser numérico.");
            } else if (Integer.parseInt(bi) <= 0 || Integer.parseInt(bi) >= 100000000) {
                tabela_de_erros.put("bi", "Número de BI inválido. Deverá estar dentro do intervalo [0-100000000], exclusive.");
            }

            // Data de Nascimento
            String data_de_nascimento_ano = (String) request.getParameter("data_de_nascimento_ano");
            if (data_de_nascimento_ano == null || data_de_nascimento_ano.trim().equals("")) {
                tabela_de_erros.put("data_de_nascimento_ano", "Ano: Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(data_de_nascimento_ano)) {
                tabela_de_erros.put("data_de_nascimento_ano", "O campo ano da data de nascimento deverá ser numérico.");
            }

            String data_de_nascimento_mes = (String) request.getParameter("data_de_nascimento_mes");
            if (data_de_nascimento_mes == null || data_de_nascimento_mes.trim().equals("")) {
                tabela_de_erros.put("data_de_nascimento_mes", "Mês: Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(data_de_nascimento_mes)) {
                tabela_de_erros.put("data_de_nascimento_mes", "O campo mês da data de nascimento deverá ser numérico.");
            }

            String data_de_nascimento_dia = (String) request.getParameter("data_de_nascimento_dia");
            if (data_de_nascimento_dia == null || data_de_nascimento_dia.trim().equals("")) {
                tabela_de_erros.put("data_de_nascimento_dia", "Dia: Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(data_de_nascimento_dia)) {
                tabela_de_erros.put("data_de_nascimento_dia", "O campo dia da data de nascimento deverá ser numérico.");
            }

            int ano = Integer.parseInt(data_de_nascimento_ano);
            int mes = Integer.parseInt(data_de_nascimento_mes);
            int dia = Integer.parseInt(data_de_nascimento_dia);
            if (data_de_nascimento_ano != null && !data_de_nascimento_ano.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_nascimento_ano) && data_de_nascimento_mes != null && !data_de_nascimento_mes.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_nascimento_mes) && data_de_nascimento_dia != null && !data_de_nascimento_dia.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_nascimento_dia)) {

                if (!UtensiliosParaDatas.eValidaDataNascimento(ano, mes, dia)) {
                    tabela_de_erros.put("data_de_nascimento", "Formato de Data Errado.");
                }
            }
            //verificar se idade > 18 anos
            if (((UtensiliosParaDatas.dateDiff(UtensiliosParaDatas.agora().getYear() + 1900, ano) < 0) || (UtensiliosParaDatas.dateDiff(UtensiliosParaDatas.agora().getYear() + 1900, ano) > 120))) {
                tabela_de_erros.put("data_de_nascimento", "Idade do utente incorreta.");
            }

            String nif = (String) request.getParameter("nif");
            if (nif == null || nif.trim().equals("")) {
                tabela_de_erros.put("nif", "Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(nif)) {
                tabela_de_erros.put("nif", "O campo NIF deverá ser numérico.");
            } else if (nif.length() < 8 || nif.length() > 9) {
                tabela_de_erros.put("nif", "Número de NIF inválido. Deverá ter entre 8 a 9 caracteres, inclusive.");
            }

            String email = (String) request.getParameter("email");
            if (email == null || email.trim().equals("")) {
                tabela_de_erros.put("email", "Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmEmail(email)) {
                tabela_de_erros.put("email", "Formato de E-Mail Inválido.");
            }

            String telefone = (String) request.getParameter("telefone");
            if (telefone == null || telefone.trim().equals("")) {
                tabela_de_erros.put("telefone", "Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(telefone)) {
                tabela_de_erros.put("telefone", "O campo telefone deverá ser numérico.");
            }

            String telemovel = (String) request.getParameter("telemovel");
            if (telemovel == null || telemovel.trim().equals("")) {
                tabela_de_erros.put("telemovel", "Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(telemovel)) {
                tabela_de_erros.put("telemovel", "O campo telemóvel deverá ser numérico.");
            }

            String morada = (String) request.getParameter("morada");
            if (morada == null || morada.trim().equals("")) {
                tabela_de_erros.put("morada", "Campo Obrigatório. Não pode estar vazio.");
            }

            // Codigo Postal
            String prefixo_codigo_postal = (String) request.getParameter("prefixo_codigo_postal");
            if (prefixo_codigo_postal == null || prefixo_codigo_postal.trim().equals("")) {
                tabela_de_erros.put("prefixo_codigo_postal", "Prefixo: Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(prefixo_codigo_postal)) {
                tabela_de_erros.put("prefixo_codigo_postal", "O campo prefixo do código postal deverá ser numérico.");
            }

            String sufixo_codigo_postal = (String) request.getParameter("sufixo_codigo_postal");
            if (sufixo_codigo_postal == null || sufixo_codigo_postal.trim().equals("")) {
                tabela_de_erros.put("sufixo_codigo_postal", "Sufixo: Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(sufixo_codigo_postal)) {
                tabela_de_erros.put("sufixo_codigo_postal", "O campo sufixo do código postal deverá ser numérico.");
            }

            String localidade = (String) request.getParameter("localidade");
            if (localidade == null || localidade.trim().equals("")) {
                tabela_de_erros.put("localidade", "Campo Obrigatório. Não pode estar vazio.");
            } else if (UtensiliosParaStrings.eApenasLetras(localidade)) {
                tabela_de_erros.put("localidade", "O campo localidade pode apenas conter caracteres alfab�ticos.");
            }

            String grupo_sanguineo = (String) request.getParameter("grupo_sanguineo");
            if (grupo_sanguineo == null || grupo_sanguineo.trim().equals("")) {
                tabela_de_erros.put("grupo_sanguineo", "Campo Obrigatório. Não pode estar vazio.");
            }
            if (!grupo_sanguineo.equals("O+") && !grupo_sanguineo.equals("A+") && !grupo_sanguineo.equals("B+") && !grupo_sanguineo.equals("AB+") && !grupo_sanguineo.equals("O-") && !grupo_sanguineo.equals("A-") && !grupo_sanguineo.equals("B-") && !grupo_sanguineo.equals("AB-") && !grupo_sanguineo.equals("desconhecido")) {
                tabela_de_erros.put("grupo_sanguineo", "O Grupo Sanguíneo deverá ter um dos seguintes valores: O+, A+, B+, AB+, O-, A-, B- ou AB-.");
            }

            if (request.getParameter("tipo") != null) {
                String username = (String) request.getParameter("username");
                if (username == null || username.trim().equals("")) {
                    tabela_de_erros.put("username", "Campo Obrigat�rio. N�o pode estar vazio.");
                } else if (username.length() < 6) {
                    tabela_de_erros.put("username", "Tamanho inv�lido. O campo username dever� ter pelo menos 6 caracteres.");
                } else if (ContaDeUtilizador.existeUsername(username)) {
                    tabela_de_erros.put("username", "Username j� existente.");
                }

                String password = (String) request.getParameter("password");
                if (password == null || password.trim().equals("")) {
                    tabela_de_erros.put("password", "Campo Obrigat�rio. N�o pode estar vazio.");
                } else if (password.length() < 6) {
                    tabela_de_erros.put("password", "Tamanho inv�lido. O campo password dever� ter pelo menos 6 caracteres.");
                }

                String verification_password = (String) request.getParameter("verification_password");
                if (verification_password == null || verification_password.trim().equals("")) {
                    tabela_de_erros.put("verification_password", "Campo Obrigat�rio. N�o pode estar vazio.");
                } else if (!verification_password.equals(password)) {
                    tabela_de_erros.put("verification_password", "N�o coincide com a password.");
                }
            }

        } catch (Exception ex) {
            Logger.getLogger(GestorDeUtentes.class.getName()).log(Level.SEVERE, null, ex);
        }
        return tabela_de_erros;
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaInserirMembroAgregado(final HttpServletRequest request) throws SQLException,
            ClassNotFoundException, InstantiationException, IllegalAccessException {

        Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();

        try {
            String nome = (String) request.getParameter("nome");
            if (nome == null || nome.trim().equals("")) {
                tabela_de_erros.put("nome", "Campo Obrigatório. Não pode estar vazio.");
            } else if (UtensiliosParaStrings.eApenasLetras(nome)) {
                tabela_de_erros.put("nome", "O campo nome pode apenas conter caracteres.");
            }

            String sexo = (String) request.getParameter("sexo");
            if (sexo == null || sexo.trim().equals("")) {
                tabela_de_erros.put("sexo", "Campo Obrigatório. Não pode estar vazio.");
            } else if (!(sexo.trim().equals("M") || sexo.trim().equals("F"))) {
                tabela_de_erros.put("sexo", "Valor inválido. O campo sexo apenas poderá assumir o valor \"M\" ou \"F\".");
            }

            String bi = (String) request.getParameter("bi");
            if (bi == null || bi.trim().equals("")) {
                tabela_de_erros.put("bi", "Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(bi)) {
                tabela_de_erros.put("bi", "O campo BI deverá ser numérico.");
            } else if (Integer.parseInt(bi) <= 0 || Integer.parseInt(bi) >= 100000000) {
                tabela_de_erros.put("bi", "Número de BI inválido. Deverá estar dentro do intervalo [0-100000000], exclusive.");
            }

            // Data de Nascimento
            String data_de_nascimento_ano = (String) request.getParameter("data_de_nascimento_ano");
            if (data_de_nascimento_ano == null || data_de_nascimento_ano.trim().equals("")) {
                tabela_de_erros.put("data_de_nascimento_ano", "Ano: Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(data_de_nascimento_ano)) {
                tabela_de_erros.put("data_de_nascimento_ano", "O campo ano da data de nascimento deverá ser numérico.");
            }

            String data_de_nascimento_mes = (String) request.getParameter("data_de_nascimento_mes");
            if (data_de_nascimento_mes == null || data_de_nascimento_mes.trim().equals("")) {
                tabela_de_erros.put("data_de_nascimento_mes", "Mês: Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(data_de_nascimento_mes)) {
                tabela_de_erros.put("data_de_nascimento_mes", "O campo mês da data de nascimento deverá ser numérico.");
            }

            String data_de_nascimento_dia = (String) request.getParameter("data_de_nascimento_dia");
            if (data_de_nascimento_dia == null || data_de_nascimento_dia.trim().equals("")) {
                tabela_de_erros.put("data_de_nascimento_dia", "Dia: Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(data_de_nascimento_dia)) {
                tabela_de_erros.put("data_de_nascimento_dia", "O campo dia da data de nascimento deverá ser numérico.");
            }

            int ano = Integer.parseInt(data_de_nascimento_ano);
            int mes = Integer.parseInt(data_de_nascimento_mes);
            int dia = Integer.parseInt(data_de_nascimento_dia);
            if (data_de_nascimento_ano != null && !data_de_nascimento_ano.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_nascimento_ano) && data_de_nascimento_mes != null && !data_de_nascimento_mes.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_nascimento_mes) && data_de_nascimento_dia != null && !data_de_nascimento_dia.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_nascimento_dia)) {

                if (!UtensiliosParaDatas.eValidaDataNascimentoMembroAgregado(ano, mes, dia)) {
                    tabela_de_erros.put("data_de_nascimento", "Formato de Data Errado.");
                }
            }
            // verificar se idade > 18 anos
            // if ( ((UtensiliosParaDatas.dateDiff(UtensiliosParaDatas.agora().getYear() + 1900, ano) < 0 ) || (UtensiliosParaDatas.dateDiff(UtensiliosParaDatas.agora().getYear() + 1900, ano) > 120)) ) {
            if (UtensiliosParaDatas.eValidaDataNascimentoMembroAgregado(ano, mes, dia) == false) {
                tabela_de_erros.put("data_de_nascimento", "Idade do utente incorreta.");
            }

            String nif = (String) request.getParameter("nif");
            if (nif == null || nif.trim().equals("")) {
                tabela_de_erros.put("nif", "Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(nif)) {
                tabela_de_erros.put("nif", "O campo NIF deverá ser numérico.");
            } else if (nif.length() < 8 || nif.length() > 9) {
                tabela_de_erros.put("nif", "Número de NIF inválido. Deverá ter entre 8 a 9 caracteres, inclusive.");
            }

            String email = (String) request.getParameter("email");
            if (email == null || email.trim().equals("")) {
                tabela_de_erros.put("email", "Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmEmail(email)) {
                tabela_de_erros.put("email", "Formato de E-Mail Inválido.");
            }

            String telefone = (String) request.getParameter("telefone");
            if (telefone == null || telefone.trim().equals("")) {
                tabela_de_erros.put("telefone", "Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(telefone)) {
                tabela_de_erros.put("telefone", "O campo telefone deverá ser numérico.");
            }

            String telemovel = (String) request.getParameter("telemovel");
            if (telemovel == null || telemovel.trim().equals("")) {
                tabela_de_erros.put("telemovel", "Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(telemovel)) {
                tabela_de_erros.put("telemovel", "O campo telemóvel deverá ser numérico.");
            }

            String morada = (String) request.getParameter("morada");
            if (morada == null || morada.trim().equals("")) {
                tabela_de_erros.put("morada", "Campo Obrigatório. Não pode estar vazio.");
            }

            // Codigo Postal
            String prefixo_codigo_postal = (String) request.getParameter("prefixo_codigo_postal");
            if (prefixo_codigo_postal == null || prefixo_codigo_postal.trim().equals("")) {
                tabela_de_erros.put("prefixo_codigo_postal", "Prefixo: Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(prefixo_codigo_postal)) {
                tabela_de_erros.put("prefixo_codigo_postal", "O campo prefixo do código postal deverá ser numérico.");
            }

            String sufixo_codigo_postal = (String) request.getParameter("sufixo_codigo_postal");
            if (sufixo_codigo_postal == null || sufixo_codigo_postal.trim().equals("")) {
                tabela_de_erros.put("sufixo_codigo_postal", "Sufixo: Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(sufixo_codigo_postal)) {
                tabela_de_erros.put("sufixo_codigo_postal", "O campo sufixo do código postal deverá ser numérico.");
            }

            String localidade = (String) request.getParameter("localidade");
            if (localidade == null || localidade.trim().equals("")) {
                tabela_de_erros.put("localidade", "Campo Obrigatório. Não pode estar vazio.");
            } else if (UtensiliosParaStrings.eApenasLetras(localidade)) {
                tabela_de_erros.put("localidade", "O campo localidade pode apenas conter caracteres.");
            }

            String grupo_sanguineo = (String) request.getParameter("grupo_sanguineo");
            if (grupo_sanguineo == null || grupo_sanguineo.trim().equals("")) {
                tabela_de_erros.put("grupo_sanguineo", "Campo Obrigatório. Não pode estar vazio.");
            }
            if (!grupo_sanguineo.equals("O+") && !grupo_sanguineo.equals("A+") && !grupo_sanguineo.equals("B+") && !grupo_sanguineo.equals("AB+") && !grupo_sanguineo.equals("O-") && !grupo_sanguineo.equals("A-") && !grupo_sanguineo.equals("B-") && !grupo_sanguineo.equals("AB-") && !grupo_sanguineo.equals("desconhecido")) {
                tabela_de_erros.put("grupo_sanguineo", "O Grupo Sanguíneo deverá ter um dos seguintes valores: O+, A+, B+, AB+, O-, A-, B- ou AB-.");
            }

            if (request.getParameter("tipo") != null) {
                String username = (String) request.getParameter("username");
                if (username == null || username.trim().equals("")) {
                    tabela_de_erros.put("username", "Campo Obrigat�rio. N�o pode estar vazio.");
                } else if (username.length() < 6) {
                    tabela_de_erros.put("username", "Tamanho inv�lido. O campo username dever� ter pelo menos 6 caracteres.");
                } else if (ContaDeUtilizador.existeUsername(username)) {
                    tabela_de_erros.put("username", "Username j� existente.");
                }

                String password = (String) request.getParameter("password");
                if (password == null || password.trim().equals("")) {
                    tabela_de_erros.put("password", "Campo Obrigat�rio. N�o pode estar vazio.");
                } else if (password.length() < 6) {
                    tabela_de_erros.put("password", "Tamanho inv�lido. O campo password dever� ter pelo menos 6 caracteres.");
                }

                String verification_password = (String) request.getParameter("verification_password");
                if (verification_password == null || verification_password.trim().equals("")) {
                    tabela_de_erros.put("verification_password", "Campo Obrigat�rio. N�o pode estar vazio.");
                } else if (!verification_password.equals(password)) {
                    tabela_de_erros.put("verification_password", "N�o coincide com a password.");
                }
            }
        } catch (Exception ex) {
            Logger.getLogger(GestorDeUtentes.class.getName()).log(Level.SEVERE, null, ex);
        }
        return tabela_de_erros;
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaCriarContaDeUtilizador(final HttpServletRequest request) {

        Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();
        // try {
        String username = (String) request.getParameter("username");
        if (username == null || username.trim().equals("")) {
            tabela_de_erros.put("username", "Campo Obrigat�rio. N�o pode estar vazio.");
        } else if (username.length() < 6) {
            tabela_de_erros.put("username", "Tamanho inv�lido. O campo username dever� ter pelo menos 6 caracteres.");
        } else if (ContaDeUtilizador.existeUsername(username)) {
            tabela_de_erros.put("username", "Username j� existente.");
        }

        String password = (String) request.getParameter("password");
        if (password == null || password.trim().equals("")) {
            tabela_de_erros.put("password", "Campo Obrigat�rio. N�o pode estar vazio.");
        } else if (password.length() < 6) {
            tabela_de_erros.put("password", "Tamanho inv�lido. O campo password dever� ter pelo menos 6 caracteres.");
        }

        String verification_password = (String) request.getParameter("verification_password");
        if (verification_password == null || verification_password.trim().equals("")) {
            tabela_de_erros.put("verification_password", "Campo Obrigat�rio. N�o pode estar vazio.");
        } else if (!verification_password.equals(password)) {
            tabela_de_erros.put("verification_password", "N�o coincide com a password.");
        }

//        } catch (SQLException ex) {
//            Logger.getLogger(GestorDeUtentes.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (ClassNotFoundException ex) {
//            Logger.getLogger(GestorDeUtentes.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (InstantiationException ex) {
//            Logger.getLogger(GestorDeUtentes.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (IllegalAccessException ex) {
//            Logger.getLogger(GestorDeUtentes.class.getName()).log(Level.SEVERE, null, ex);
//        }
        return tabela_de_erros;
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaAlterarPessoa(final HttpServletRequest request) {

        Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();

        String nome = (String) request.getParameter("nome");
        if (nome == null || nome.trim().equals("")) {
            tabela_de_erros.put("nome", "Campo Obrigatório. Não pode estar vazio.");
        }

        String sexo = (String) request.getParameter("sexo");
        if (sexo == null || sexo.trim().equals("")) {
            tabela_de_erros.put("sexo", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!(sexo.trim().equals("M") || sexo.trim().equals("F"))) {
            tabela_de_erros.put("sexo", "Valor inválido. O campo sexo apenas poderá assumir o valor \"M\" ou \"F\".");
        }

        String bi = (String) request.getParameter("bi");
        if (bi == null || bi.trim().equals("")) {
            tabela_de_erros.put("bi", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(bi)) {
            tabela_de_erros.put("bi", "O campo BI deverá ser numérico.");
        } else if (Integer.parseInt(bi) <= 0 || Integer.parseInt(bi) >= 100000000) {
            tabela_de_erros.put("bi", "Número de BI inválido. Deverá estar dentro do intervalo [0-100000000], exclusive.");
        }

        // Data de Nascimento
        String data_de_nascimento_ano = (String) request.getParameter("data_de_nascimento_ano");
        if (data_de_nascimento_ano == null || data_de_nascimento_ano.trim().equals("")) {
            tabela_de_erros.put("data_de_nascimento_ano", "Ano: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_nascimento_ano)) {
            tabela_de_erros.put("data_de_nascimento_ano", "O campo ano da data de nascimento deverá ser numérico.");
        }

        String data_de_nascimento_mes = (String) request.getParameter("data_de_nascimento_mes");
        if (data_de_nascimento_mes == null || data_de_nascimento_mes.trim().equals("")) {
            tabela_de_erros.put("data_de_nascimento_mes", "Mês: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_nascimento_mes)) {
            tabela_de_erros.put("data_de_nascimento_mes", "O campo mês da data de nascimento deverá ser numérico.");
        }

        String data_de_nascimento_dia = (String) request.getParameter("data_de_nascimento_dia");
        if (data_de_nascimento_dia == null || data_de_nascimento_dia.trim().equals("")) {
            tabela_de_erros.put("data_de_nascimento_dia", "Dia: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_de_nascimento_dia)) {
            tabela_de_erros.put("data_de_nascimento_dia", "O campo dia da data de nascimento deverá ser numérico.");
        }

        if (data_de_nascimento_ano != null && !data_de_nascimento_ano.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_nascimento_ano) && data_de_nascimento_mes != null && !data_de_nascimento_mes.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_nascimento_mes) && data_de_nascimento_dia != null && !data_de_nascimento_dia.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_de_nascimento_dia)) {
            int ano = Integer.parseInt(data_de_nascimento_ano);
            int mes = Integer.parseInt(data_de_nascimento_mes);
            int dia = Integer.parseInt(data_de_nascimento_dia);
            Date data_nasc = UtensiliosParaDatas.devolveData(ano, mes, dia);
            Calendar c = Calendar.getInstance();
            Date data_actual = UtensiliosParaDatas.devolveData(c.get(Calendar.YEAR), c.get(Calendar.MONTH) + 1, c.get(Calendar.DATE));

            if (data_nasc.after(data_actual)) {
                tabela_de_erros.put("data_de_nascimento", "Formato de Data Errado.");
            }

            //ver data maior q 18 para titular
        /*    if (verificaMaiorIdade) {

            if ((c.get(Calendar.YEAR) - ano)< 18) {
            tabela_de_erros.put("data_de_nascimento", "Idade do utente incorreta.");
            }
            System.out.println("###### username           " + request.getAttribute("username") + (c.get(Calendar.YEAR) - ano));
            }*/
        }

        String nif = (String) request.getParameter("nif");
        if (nif == null || nif.trim().equals("")) {
            tabela_de_erros.put("nif", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(nif)) {
            tabela_de_erros.put("nif", "O campo NIF deverá ser numérico.");
        } else if (nif.length() < 8 || nif.length() > 9) {
            tabela_de_erros.put("nif", "Número de NIF inválido. Deverá ter entre 8 a 9 caracteres, inclusive.");
        }

        String email = (String) request.getParameter("email");
        if (email == null || email.trim().equals("")) {
            tabela_de_erros.put("email", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmEmail(email)) {
            tabela_de_erros.put("email", "Formato de E-Mail Inválido.");
        }

        String telefone = (String) request.getParameter("telefone");
        if (telefone == null || telefone.trim().equals("")) {
            tabela_de_erros.put("telefone", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(telefone)) {
            tabela_de_erros.put("telefone", "O campo telefone deverá ser numérico.");
        }

        String telemovel = (String) request.getParameter("telemovel");
        if (telemovel == null || telemovel.trim().equals("")) {
            tabela_de_erros.put("telemovel", "Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(telemovel)) {
            tabela_de_erros.put("telemovel", "O campo telemóvel deverá ser numérico.");
        }

        String morada = (String) request.getParameter("morada");
        if (morada == null || morada.trim().equals("")) {
            tabela_de_erros.put("morada", "Campo Obrigatório. Não pode estar vazio.");
        }

        // Codigo Postal
        String prefixo_codigo_postal = (String) request.getParameter("prefixo_codigo_postal");
        if (prefixo_codigo_postal == null || prefixo_codigo_postal.trim().equals("")) {
            tabela_de_erros.put("prefixo_codigo_postal", "Prefixo: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(prefixo_codigo_postal)) {
            tabela_de_erros.put("prefixo_codigo_postal", "O campo prefixo do código postal deverá ser numérico.");
        }

        String sufixo_codigo_postal = (String) request.getParameter("sufixo_codigo_postal");
        if (sufixo_codigo_postal == null || sufixo_codigo_postal.trim().equals("")) {
            tabela_de_erros.put("sufixo_codigo_postal", "Sufixo: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(sufixo_codigo_postal)) {
            tabela_de_erros.put("sufixo_codigo_postal", "O campo sufixo do código postal deverá ser numérico.");
        }

        String localidade = (String) request.getParameter("localidade");
        if (localidade == null || localidade.trim().equals("")) {
            tabela_de_erros.put("localidade", "Campo Obrigatório. Não pode estar vazio.");
        } else if (UtensiliosParaStrings.eApenasLetras(localidade)) {
            tabela_de_erros.put("localidade", "O campo localidade pode apenas conter caracteres alfab�ticos.");
        }

        String grupo_sanguineo = (String) request.getParameter("grupo_sanguineo");
        if (grupo_sanguineo == null || grupo_sanguineo.trim().equals("")) {
            tabela_de_erros.put("grupo_sanguineo", "Campo Obrigatório. Não pode estar vazio.");
        }
        if (!grupo_sanguineo.equals("O+") && !grupo_sanguineo.equals("A+") && !grupo_sanguineo.equals("B+") && !grupo_sanguineo.equals("AB+") && !grupo_sanguineo.equals("O-") && !grupo_sanguineo.equals("A-") && !grupo_sanguineo.equals("B-") && !grupo_sanguineo.equals("AB-") && !grupo_sanguineo.equals("desconhecido")) {
            tabela_de_erros.put("grupo_sanguineo", "O Grupo Sanguíneo deverá ter um dos seguintes valores: O+, A+, B+, AB+, O-, A-, B- ou AB-.");
        }

        String password = (String) request.getParameter("password");
        if (password != null && !password.trim().equals("") && password.length() < 6) {
            tabela_de_erros.put("password", "Tamanho inválido. O campo password deverá ter pelo menos 6 caracteres.");
        }

        String verification_password = (String) request.getParameter("verification_password");
        if (verification_password != null && !verification_password.trim().equals("") && !verification_password.equals(password)) {
            tabela_de_erros.put("verification_password", "Não coincide com a password.");
        }

        return tabela_de_erros;
    }

    /* public void adicionarDoencaGenerica(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
    try {

    if (dadosEstaoValidos(request, GestorDeUtentes.ADICIONAR_DOENCA_GENERICA)) {
    DoencaGenerica dados_da_doenca_generica = populaTabelaInserirDoencaGenerica(request);

    Long id_pessoa = Long.parseLong(request.getParameter("id"));

    //DoencaGenerica.insere(dados_da_doenca_generica);

    response.sendRedirect("/Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_pessoa);

    } else {

    session.setAttribute("erros", devolveTabelaDeErrosParaInserirDoencaGenerica(request));

    session.setAttribute("nome", request.getParameter("nome"));
    session.setAttribute("descricao", request.getParameter("descricao"));
    session.setAttribute("sintomas", request.getParameter("sintomas"));
    session.setAttribute("tratamento", request.getParameter("tratamento"));

    response.sendRedirect("/adiciona_doenca_generica.jsp");
    }
    } catch (SQLException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (InstantiationException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (IOException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    }
    }

    public void alterarDoencaGenerica(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
    try {
    String sub_accao = (String) request.getParameter("sub_accao");
    if (sub_accao != null && sub_accao.equals("primeira")) {

    Long id_tratamento_passado = Long.parseLong((String) request.getParameter("id"));
    //  TratamentoPassado tratamento_passado = TratamentoPassado.devolve(id_tratamento_passado);

    session.setAttribute("id_tratamento_passado", id_tratamento_passado);
    /*
    session.setAttribute("data_ano", UtensiliosParaDatas.devolveAnoDaData(tratamento_passado.getData()));
    session.setAttribute("data_mes", UtensiliosParaDatas.devolveMesDaData(tratamento_passado.getData()));
    session.setAttribute("data_dia", UtensiliosParaDatas.devolveDiaDaData(tratamento_passado.getData()));

    session.setAttribute("descricao", tratamento_passado.getDescricao());
    session.setAttribute("observacao", tratamento_passado.getObservacao());
     */
    /*          response.sendRedirect("/altera_doenca_passada.jsp");


    } else if (sub_accao != null && sub_accao.equals("segunda")) {
    if (dadosEstaoValidos(request, GestorDeUtentes.ALTERAR_DOENCA_GENERICA)) {


    Long id_doenca_generica = (Long) session.getAttribute("id_doenca_generica");
    DoencaGenerica doenca_generica = DoencaGenerica.devolve(id_doenca_generica);

    doenca_generica.setNome(request.getParameter("nome"));
    doenca_generica.setDescricao(request.getParameter("descricao"));
    doenca_generica.setSintomas(request.getParameter("sintomas"));
    doenca_generica.setTratamento(request.getParameter("tratamento"));

    session.setAttribute("erros", null);
    response.sendRedirect("/Gestor?gestor=gestor_de_utentes&accao=visualizar_doenca_generica&id=" + id_doenca_generica);

    } else {

    session.setAttribute("erros", devolveTabelaDeErrosParaAlterarDoencaGenerica(request));

    session.setAttribute("nome", request.getParameter("nome"));
    session.setAttribute("descricao", request.getParameter("descricao"));
    session.setAttribute("sintomas", request.getParameter("sintomas"));
    session.setAttribute("tratamento", request.getParameter("tratamento"));

    response.sendRedirect("/altera_doenca_generica.jsp");
    }
    } else {
    session.setAttribute("excepcao", "Url incorrecto.");
    response.sendRedirect("/mostra_erro.jsp");
    }


    } catch (SQLException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (InstantiationException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (IOException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    }


    }

    public void removerDoencaGenerica(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
    try {
    Long id_doenca_generica = Long.parseLong(request.getParameter("id"));
    Long id_titular = Long.parseLong((String) request.getParameter("titular"));

    DoencaGenerica.remove(id_doenca_generica);

    response.sendRedirect("Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_titular);

    } catch (SQLException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (InstantiationException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (IOException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    }
    }

    public void removerDoencasGenericas(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {

    try {
    String[] ids_doenca_generica_a_remover = request.getParameterValues("doencas_genericas");
    Long id_titular = Long.parseLong((String) request.getParameter("titular"));

    for (String doenca_generica_string : ids_doenca_generica_a_remover) {
    Long id_doenca_generica = Long.parseLong(doenca_generica_string);

    DoencaGenerica.remove(id_doenca_generica);
    }

    response.sendRedirect("Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_titular);


    } catch (SQLException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_DOENCAS_GENERICAS);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_DOENCAS_GENERICAS);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (InstantiationException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_DOENCAS_GENERICAS);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_DOENCAS_GENERICAS);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (IOException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_DOENCAS_GENERICAS);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    }
    }

    public void visualizarDoencaGenerica(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
    try {
    Long id_doenca_generica = Long.parseLong(request.getParameter("id_doenca_generica"));

    DoencaGenerica doenca_generica = DoencaGenerica.devolve(id_doenca_generica);

    session.setAttribute("doenca_generica", doenca_generica);
    response.sendRedirect("/visualizar_doenca_generica.jsp");


    } catch (SQLException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.VISUALIZAR_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.VISUALIZAR_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (InstantiationException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.VISUALIZAR_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.VISUALIZAR_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (IOException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.VISUALIZAR_DOENCA_GENERICA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    }
    }

    private DoencaGenerica populaTabelaInserirDoencaGenerica(final HttpServletRequest request) throws NoSuchAlgorithmException {

    Hashtable<String, Object> dados = new Hashtable<String, Object>();


    // nome,descricao,sintomas,tratamento
    dados.put("var_nome", (String) request.getParameter("nome"));
    dados.put("var_descricao", (String) request.getParameter("descricao"));
    dados.put("var_sintomas", (String) request.getParameter("sintomas"));
    dados.put("var_tratamento", (String) request.getParameter("tratamento"));

    DoencaGenerica dg = new DoencaGenerica((String) request.getParameter("nome"),
    (String) request.getParameter("descricao"), (String) request.getParameter("sintomas"),
    (String) request.getParameter("tratamento"));


    return dg;
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaInserirDoencaGenerica(final HttpServletRequest request) throws SQLException,
    ClassNotFoundException, InstantiationException, IllegalAccessException {


    Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();

    String nome = (String) request.getParameter("nome");
    if (nome == null || nome.trim().equals("")) {
    tabela_de_erros.put("nome", "Campo Obrigatório. Não pode estar vazio.");
    }


    String descricao = (String) request.getParameter("descricao");
    if (descricao == null || descricao.trim().equals("")) {
    tabela_de_erros.put("descricao", "Campo Obrigatório. Não pode estar vazio.");
    }


    String sintomas = (String) request.getParameter("sintomas");
    if (sintomas == null || sintomas.trim().equals("")) {
    tabela_de_erros.put("sintomas", "Campo Obrigatório. Não pode estar vazio.");
    }


    String tratamento = (String) request.getParameter("tratamento");
    if (tratamento == null || tratamento.trim().equals("")) {
    tabela_de_erros.put("tratamento", "Campo Obrigatório. Não pode estar vazio.");
    }


    return tabela_de_erros;
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaAlterarDoencaGenerica(final HttpServletRequest request) {
    Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();


    String nome = (String) request.getParameter("nome");
    if (nome == null || nome.trim().equals("")) {
    tabela_de_erros.put("nome", "Campo Obrigatório. Não pode estar vazio.");
    }


    String descricao = (String) request.getParameter("descricao");
    if (descricao == null || descricao.trim().equals("")) {
    tabela_de_erros.put("descricao", "Campo Obrigatório. Não pode estar vazio.");
    }


    String sintomas = (String) request.getParameter("sintomas");
    if (sintomas == null || sintomas.trim().equals("")) {
    tabela_de_erros.put("sintomas", "Campo Obrigatório. Não pode estar vazio.");
    }


    String tratamento = (String) request.getParameter("tratamento");
    if (tratamento == null || tratamento.trim().equals("")) {
    tabela_de_erros.put("tratamento", "Campo Obrigatório. Não pode estar vazio.");
    }


    return tabela_de_erros;
    }
     */
    public void adicionarDoencaPassada(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {
            String sub_accao = (String) request.getParameter("sub_accao");
            if (sub_accao != null && sub_accao.equals("primeira")) {

                session.setAttribute("doencas_genericas", DoencaGenerica.lista_dg());
                Long id_pessoa = Long.parseLong(request.getParameter("id"));
                session.setAttribute("id_pessoa", id_pessoa);

                response.sendRedirect("/adiciona_doenca_passada.jsp");


            } else if (sub_accao != null && sub_accao.equals("segunda")) {
                if (dadosEstaoValidos(request, GestorDeUtentes.ADICIONAR_DOENCA_PASSADA)) {
                    DoencaPassada dados_da_doenca_passada = populaTabelaInserirDoencaPassada(request);

                    Long id_pessoa = Long.parseLong(request.getParameter("id"));
                    dados_da_doenca_passada.setIdPessoa(id_pessoa);

                    boolean temConta = Pessoa.temContaDeUtilzador(id_pessoa);
                    if (temConta) {
                        Utente cliente_particular = Utente.devolvePorIdPessoa(id_pessoa);
                        cliente_particular.adicionaDoencaPassada(dados_da_doenca_passada);


                    } else {
                        Pessoa membro_do_agregado = MembroDoAgregado.devolve(id_pessoa);
                        membro_do_agregado.adicionaDoencaPassada(dados_da_doenca_passada);
                        System.out.println("Entrei no Agregado");
                    }

                    session.setAttribute("erros", null);

                    //response.sendRedirect("/Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_pessoa);
                    session.setAttribute("msg_sucesso", "Doen�a passada inserida com sucesso.");
                    session.setAttribute("nome_pagina_link", "dos dados pessoais");
                    session.setAttribute("pagina_link", "/Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_pessoa);
                    response.sendRedirect("/mostra_sucesso.jsp");

                } else {

                    session.setAttribute("erros", devolveTabelaDeErrosParaInserirDoencaPassada(request));

                    session.setAttribute("doenca_generica", request.getParameter("doenca_generica"));

                    session.setAttribute("data_ano", request.getParameter("data_ano"));
                    session.setAttribute("data_mes", request.getParameter("data_mes"));
                    session.setAttribute("data_dia", request.getParameter("data_dia"));

                    session.setAttribute("sintomas", request.getParameter("sintomas"));
                    session.setAttribute("tratamento", request.getParameter("tratamento"));

                    response.sendRedirect("/adiciona_doenca_passada.jsp");
                }
            } else {
                session.setAttribute("excepcao", "Url incorrecto.");
                response.sendRedirect("/mostra_erro.jsp");
            }


        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_DOENCA_PASSADA);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_DOENCA_PASSADA);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (InstantiationException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_DOENCA_PASSADA);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_DOENCA_PASSADA);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_DOENCA_PASSADA);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_DOENCA_PASSADA);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    public void alterarDoencaPassada(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {
            String sub_accao = (String) request.getParameter("sub_accao");
            if (sub_accao != null && sub_accao.equals("primeira")) {
                session.setAttribute("lista_doencas_passadas", DoencaGenerica.lista_dg());


                Long id_doenca_passada = Long.parseLong(request.getParameter("id"));
                Long id_pessoa = Long.parseLong(request.getParameter("id_pessoa"));


                DoencaPassada doenca_passada = DoencaPassada.devolve(id_doenca_passada);
                String doenca_generica = doenca_passada.getDoencaGenerica();


                // Propaga dados, previamente inseridos, pela sessao
                session.setAttribute("id_doenca", id_doenca_passada);
                session.setAttribute("id_pessoa", id_pessoa);

                session.setAttribute("nome", doenca_generica);

                session.setAttribute("data_ano", UtensiliosParaDatas.devolveAnoDaData(doenca_passada.getData()));
                session.setAttribute("data_mes", UtensiliosParaDatas.devolveMesDaData(doenca_passada.getData()));
                session.setAttribute("data_dia", UtensiliosParaDatas.devolveDiaDaData(doenca_passada.getData()));

                session.setAttribute("sintomas", doenca_passada.getSintomas());
                session.setAttribute("tratamento", doenca_passada.getTratamento());


                response.sendRedirect("/altera_doenca_passada.jsp");


            } else if (sub_accao != null && sub_accao.equals("segunda")) {
                if (dadosEstaoValidos(request, GestorDeUtentes.ALTERAR_DOENCA_PASSADA)) {

                    DoencaPassada dados_da_doenca_passada = populaTabelaInserirDoencaPassada(request);

                    Long id_doenca_passada = Long.parseLong(request.getParameter("id"));
                    Long id_pessoa = Long.parseLong(request.getParameter("id_pessoa"));

                    dados_da_doenca_passada.setIdDoenca(id_doenca_passada);

                    boolean temConta = Pessoa.temContaDeUtilzador(id_pessoa);
                    if (temConta) {
                        Utente cliente_particular = Utente.devolvePorIdPessoa(id_pessoa);
                        cliente_particular.alteraDoencaPassada(dados_da_doenca_passada);
                        session.setAttribute("particular", cliente_particular);

                    } else {
                        Pessoa membro_do_agregado = MembroDoAgregado.devolve(id_pessoa);
                        membro_do_agregado.alteraDoencaPassada(dados_da_doenca_passada);
                        session.setAttribute("membro_do_agregado", membro_do_agregado);
                    }

                    session.setAttribute("erros", null);

                    //response.sendRedirect("Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_pessoa);
                    session.setAttribute("msg_sucesso", "Doen�a passada alterada com sucesso.");
                    session.setAttribute("nome_pagina_link", "dos dados pessoais");
                    session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_pessoa);
                    response.sendRedirect("/mostra_sucesso.jsp");

                } else {
                    session.setAttribute("erros", devolveTabelaDeErrosParaInserirDoencaPassada(request));

                    session.setAttribute("sintomas", request.getParameter("sintomas"));
                    session.setAttribute("tratamento", request.getParameter("tratamento"));

                    response.sendRedirect("/altera_doenca_passada.jsp");
                }
            } else {
                session.setAttribute("excepcao", "Url incorrecto.");
                response.sendRedirect("/mostra_erro.jsp");
            }


        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_DOENCA_PASSADA);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_DOENCA_PASSADA);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (InstantiationException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_DOENCA_PASSADA);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_DOENCA_PASSADA);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_DOENCA_PASSADA);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_DOENCA_PASSADA);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }


    }

    /*   public void removerDoencaPassada(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {

    try {
    Long id_doenca_passada = Long.parseLong((String) request.getParameter("id"));

    Long id_titular = Long.parseLong(request.getParameter("titular"));

    String perfil = ContaDeUtilizador.devolvePerfil(id_titular);

    //Notta: deveria ser verificado se � membro do agregado
    if (perfil == null) {
    perfil = "membro_do_agregado";
    }

    if (perfil.equals("cliente_particular")) {
    Pessoa cliente_particular = ClienteParticular.devolve(id_titular);
    //               cliente_particular.removeDoencaPassada(id_doenca_passada);

    session.setAttribute("cliente_particular", cliente_particular);
    } /*else if (perfil.equals("cliente_empresa")) {
    ClienteEmpresa cliente_empresa = ClienteEmpresa.devolve(id_titular);
    cliente_empresa.removeDoencaPassada(id_doenca_passada);


    session.setAttribute("cliente_empresa", cliente_empresa);
    }*/
    /*else if (perfil.equals("membro_do_agregado")) {
    Pessoa membro_do_agregado = MembroDoAgregado.devolve(id_titular);
    //                membro_do_agregado.removeDoencaPassada(id_doenca_passada);

    session.setAttribute("membro_do_agregado", membro_do_agregado);
    }

    //response.sendRedirect("Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_titular);
    session.setAttribute("msg_sucesso", "Doen�a passada removida com sucesso.");
    session.setAttribute("nome_pagina_link", "dos dados pessoais");
    session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_titular);
    response.sendRedirect("/mostra_sucesso.jsp");


    } catch (IOException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_DOENCA_PASSADA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    }
    }

    public void removerDoencasPassadas(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {

    try {

    String[] ids_doenca_passada_a_remover = request.getParameterValues("doencas_passadas");
    Long id_titular = Long.parseLong((String) request.getParameter("titular"));


    if (ids_doenca_passada_a_remover != null) {
    for (String doenca_passada_string : ids_doenca_passada_a_remover) {
    Long id_doenca_passada = Long.parseLong(doenca_passada_string);

    String perfil = ContaDeUtilizador.devolvePerfil(id_titular);

    //Notta: deveria ser verificado se � membro do agregado
    if (perfil == null) {
    perfil = "membro_do_agregado";
    }

    if (perfil.equals("cliente_particular")) {
    Pessoa cliente_particular = ClienteParticular.devolve(id_titular);
    //                        cliente_particular.removeDoencaPassada(id_doenca_passada);
    session.setAttribute("utilizador", cliente_particular);
    } /*else if (perfil.equals("cliente_empresa")) {
    ClienteEmpresa cliente_empresa = ClienteEmpresa.devolve(id_titular);
    cliente_empresa.removeDoencaPassada(id_doenca_passada);
    session.setAttribute("utilizador", cliente_empresa);
    } */
    /*else if (perfil.equals("membro_do_agregado")) {
    Pessoa membro_do_agregado = MembroDoAgregado.devolve(id_titular);
    //                        membro_do_agregado.removeDoencaPassada(id_doenca_passada);
    session.setAttribute("utilizador", membro_do_agregado);
    }
    }
    }

    //response.sendRedirect("Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_titular);
    session.setAttribute("msg_sucesso", "Doen�as passadas removidas com sucesso.");
    session.setAttribute("nome_pagina_link", "dos dados pessoais");
    session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_titular);
    response.sendRedirect("/mostra_sucesso.jsp");


    //        } catch (SQLException e) {
    //            e.printStackTrace();
    //            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_DOENCAS_PASSADAS);
    //            session.setAttribute("excepcao", e.toString());
    //            response.sendRedirect("/mostra_erro.jsp");
    //        } catch (ClassNotFoundException e) {
    //            e.printStackTrace();
    //            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_DOENCAS_PASSADAS);
    //            session.setAttribute("excepcao", e.toString());
    //            response.sendRedirect("/mostra_erro.jsp");
    //        } catch (InstantiationException e) {
    //            e.printStackTrace();
    //            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_DOENCAS_PASSADAS);
    //            session.setAttribute("excepcao", e.toString());
    //            response.sendRedirect("/mostra_erro.jsp");
    //        } catch (IllegalAccessException e) {
    //            e.printStackTrace();
    //            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_DOENCAS_PASSADAS);
    //            session.setAttribute("excepcao", e.toString());
    //            response.sendRedirect("/mostra_erro.jsp");
    } catch (IOException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_DOENCAS_PASSADAS);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    }
    }

     */

    /*   public void visualizarDoencaPassada(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
    try {
    Long id_doenca_passada = Long.parseLong((String) request.getParameter("id"));
    DoencaPassada doenca_passada = DoencaPassada.devolve(id_doenca_passada);

    session.setAttribute("doenca_passada", doenca_passada);

    response.sendRedirect("/visualizar_doenca_passada.jsp");


    } catch (SQLException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.VISUALIZAR_DOENCA_PASSADA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.VISUALIZAR_DOENCA_PASSADA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (InstantiationException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.VISUALIZAR_DOENCA_PASSADA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.VISUALIZAR_DOENCA_PASSADA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    } catch (IOException e) {
    e.printStackTrace();
    System.out.println("Ocorreu um erro no..." + GestorDeUtentes.VISUALIZAR_DOENCA_PASSADA);
    session.setAttribute("excepcao", e.toString());
    response.sendRedirect("/mostra_erro.jsp");
    }
    }
     *
     */
    private void pesquisarUtente(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {


        try {
            Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();


            String numero_de_utente = request.getParameter("numero_de_utente");

            if (numero_de_utente == null || numero_de_utente.trim().equals("")) {
                tabela_de_erros.put("numero_de_utente", "Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(numero_de_utente)) {
                tabela_de_erros.put("numero_de_utente", "O campo Número de Utente deverá ser numérico.");
            } else if (numero_de_utente.length() >= 10) {
                tabela_de_erros.put("numero_de_utente", "O campo N�mero de Utente deve ter menos que 10 algarismos.");
            }


            if (!tabela_de_erros.isEmpty()) {
                session.setAttribute("erros", tabela_de_erros);
                response.sendRedirect("pesquisarUtente.jsp");
            } else {
                session.removeAttribute("erros");
                boolean temConta = Pessoa.temContaDeUtilzador(Long.parseLong(numero_de_utente));
                String perfil = "membro_do_agregado";
                if (temConta) {
                    perfil = ContaDeUtilizador.devolvePerfil(Long.parseLong(numero_de_utente));
                }
                if (perfil.equals("membro_do_agregado") || perfil.equals("particular")) {
                    response.sendRedirect("Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&sub_accao=primeira&id=" + Long.parseLong(numero_de_utente));
                } else {
                    session.setAttribute("encontrou_utente", false);
                    response.sendRedirect("pesquisarUtente.jsp");
                }

                session.setAttribute("id_utente_hahaha", numero_de_utente);

            }

        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.PESQUISAR_UTENTE);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    private void pesquisarColaborador(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {


        try {
            Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();


            String numero_de_colaborador = request.getParameter("numero_de_colaborador");
            if (numero_de_colaborador == null || numero_de_colaborador.trim().equals("")) {
                tabela_de_erros.put("numero_de_colaborador", "Campo Obrigatório. Não pode estar vazio.");
            } else if (!UtensiliosParaStrings.eUmNumero(numero_de_colaborador)) {
                tabela_de_erros.put("numero_de_colaborador", "O campo Número de colaborador deverá ser numérico.");
            } else if (numero_de_colaborador.length() >= 10) {
                tabela_de_erros.put("numero_de_colaborador", "O campo N�mero de colaborador deve ter menos que 10 algarismos.");
            }


            if (!tabela_de_erros.isEmpty()) {
                session.setAttribute("erros", tabela_de_erros);
                response.sendRedirect("pesquisarColaborador.jsp");
            } else {
                session.removeAttribute("erros");
                boolean temConta = Pessoa.temContaDeUtilzador(Long.parseLong(numero_de_colaborador));
                String perfil = "";
                if (temConta) {
                    perfil = ContaDeUtilizador.devolvePerfil(Long.parseLong(numero_de_colaborador));

                }
                if (perfil.equals("medico") || perfil.equals("enfermeiro") || perfil.equals("administrativo")) {
                    response.sendRedirect("Gestor?gestor=gestor_de_colaboradores&accao=alterar_colaborador&sub_accao=primeira&id=" + Long.parseLong(numero_de_colaborador));
                } else {
                    session.setAttribute("encontrou_colaborador", false);
                    response.sendRedirect("pesquisarColaborador.jsp");
                }


            }
            //mensagens de erro est�o mal
//        } catch (SQLException e) {
//            e.printStackTrace();
//            System.out.println("Ocorreu um erro no...");
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//            System.out.println("Ocorreu um erro no...");
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (InstantiationException e) {
//            e.printStackTrace();
//            System.out.println("Ocorreu um erro no...");
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
//        } catch (IllegalAccessException e) {
//            e.printStackTrace();
//            System.out.println("Ocorreu um erro no...");
//            session.setAttribute("excepcao", e.toString());
//            response.sendRedirect("/mostra_erro.jsp");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no...");
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    private DoencaPassada populaTabelaInserirDoencaPassada(final HttpServletRequest request) throws NoSuchAlgorithmException {

        String doenca_generica = (request.getParameter("doenca_generica"));
        Long id_pessoa = Long.parseLong(request.getParameter("id"));
        String sintomas = request.getParameter("sintomas");
        String tratamento = request.getParameter("tratamento");
        int dia = Integer.parseInt(request.getParameter("data_dia"));
        int mes = Integer.parseInt(request.getParameter("data_mes"));
        int ano = Integer.parseInt(request.getParameter("data_ano"));
        Date data = UtensiliosParaDatas.devolveData(ano, mes, dia);



        return new DoencaPassada(doenca_generica, id_pessoa, data, sintomas, tratamento);
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaInserirDoencaPassada(final HttpServletRequest request) throws SQLException,
            ClassNotFoundException, InstantiationException, IllegalAccessException {


        Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();


        // Propaga dados, previamente inseridos, pela sessao
        String id_doenca_generica = (String) request.getParameter("doenca_generica");
        if (id_doenca_generica == null || id_doenca_generica.trim().equals("")) {
            tabela_de_erros.put("doenca_generica", "Campo Obrigatório. Não pode estar vazio.");
        }


        // Data
        String data_ano = (String) request.getParameter("data_ano");
        if (data_ano == null || data_ano.trim().equals("")) {
            tabela_de_erros.put("data_ano", "Ano: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_ano)) {
            tabela_de_erros.put("data_ano", "O campo ano da data deverá ser numérico.");
        }


        String data_mes = (String) request.getParameter("data_mes");
        if (data_mes == null || data_mes.trim().equals("")) {
            tabela_de_erros.put("data_mes", "Mês: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_mes)) {
            tabela_de_erros.put("data_mes", "O campo mês da data deverá ser numérico.");
        }


        String data_dia = (String) request.getParameter("data_dia");
        if (data_dia == null || data_dia.trim().equals("")) {
            tabela_de_erros.put("data_dia", "Dia: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_dia)) {
            tabela_de_erros.put("data_dia", "O campo dia da data deverá ser numérico.");
        }


        if (data_ano != null && !data_ano.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_ano) && data_mes != null && !data_mes.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_mes) && data_dia != null && !data_dia.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_dia)) {
            int ano = Integer.parseInt(data_ano);
            int mes = Integer.parseInt(data_mes);
            int dia = Integer.parseInt(data_dia);
            if (!UtensiliosParaDatas.eValida(ano, mes, dia)) {
                tabela_de_erros.put("data", "Formato de Data Errado.");
            }
        }


        String sintomas = (String) request.getParameter("sintomas");
        if (sintomas == null || sintomas.trim().equals("")) {
            tabela_de_erros.put("sintomas", "Campo Obrigatório. Não pode estar vazio.");
        }


        String tratamento = (String) request.getParameter("tratamento");
        if (tratamento == null || tratamento.trim().equals("")) {
            tabela_de_erros.put("tratamento", "Campo Obrigatório. Não pode estar vazio.");
        }


        return tabela_de_erros;
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaAlterarDoencaPassada(final HttpServletRequest request) {
        Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();


        String sintomas = (String) request.getParameter("sintomas");
        if (sintomas == null || sintomas.trim().equals("")) {
            tabela_de_erros.put("sintomas", "Campo Obrigatório. Não pode estar vazio.");
        }


        String tratamento = (String) request.getParameter("tratamento");
        if (tratamento == null || tratamento.trim().equals("")) {
            tabela_de_erros.put("tratamento", "Campo Obrigatório. Não pode estar vazio.");
        }


        return tabela_de_erros;
    }

    public void adicionarTratamentoPassado(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {
            String sub_accao = (String) request.getParameter("sub_accao");
            if (sub_accao != null && sub_accao.equals("primeira")) {


                Long id_pessoa = Long.parseLong(request.getParameter("id"));
                session.setAttribute("id_pessoa", id_pessoa);


                response.sendRedirect("/adiciona_tratamento_passado.jsp");


            } else if (sub_accao != null && sub_accao.equals("segunda")) {
                if (dadosEstaoValidos(request, GestorDeUtentes.ADICIONAR_TRATAMENTO_PASSADO)) {
                    TratamentoPassado dados_do_tratamento_passado = populaTabelaInserirTratamentoPassado(request);

                    Long id_pessoa = Long.parseLong(request.getParameter("id"));

                    boolean temConta = Pessoa.temContaDeUtilzador(id_pessoa);
                    if (temConta) {
                        Pessoa cliente_particular = ClienteParticular.devolve(id_pessoa);
                        cliente_particular.adicionaTratamentoPassado(dados_do_tratamento_passado);

                    } else {
                        Pessoa membro_do_agregado = MembroDoAgregado.devolve(id_pessoa);
                        membro_do_agregado.adicionaTratamentoPassado(dados_do_tratamento_passado);
                    }


                    session.setAttribute("erros", null);

                    //response.sendRedirect("/Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_pessoa);
                    session.setAttribute("msg_sucesso", "Tratamento passado inserido com sucesso.");
                    session.setAttribute("nome_pagina_link", "dos dados pessoais");
                    session.setAttribute("pagina_link", "/Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_pessoa);
                    response.sendRedirect("/mostra_sucesso.jsp");

                } else {

                    session.setAttribute("erros", devolveTabelaDeErrosParaInserirTratamentoPassado(request));

                    // Propaga dados, previamente inseridos, pela sessao
                    session.setAttribute("data_ano", request.getParameter("data_ano"));
                    session.setAttribute("data_mes", request.getParameter("data_mes"));
                    session.setAttribute("data_dia", request.getParameter("data_dia"));


                    session.setAttribute("descricao", request.getParameter("descricao"));
                    session.setAttribute("observacao", request.getParameter("observacao"));


                    response.sendRedirect("/adiciona_tratamento_passado.jsp");
                }
            } else {
                session.setAttribute("excepcao", "Url incorrecto.");
                response.sendRedirect("/mostra_erro.jsp");
            }


        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_TRATAMENTO_PASSADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_TRATAMENTO_PASSADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (InstantiationException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_TRATAMENTO_PASSADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_TRATAMENTO_PASSADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_TRATAMENTO_PASSADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ADICIONAR_TRATAMENTO_PASSADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    public void alterarTratamentoPassado(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {
            String sub_accao = (String) request.getParameter("sub_accao");
            if (sub_accao != null && sub_accao.equals("primeira")) {

                Long id_tratamento_passado = Long.parseLong((String) request.getParameter("id"));
                Long id_pessoa = Long.parseLong((String) request.getParameter("id_pessoa"));

                TratamentoPassado tratamento_passado = TratamentoPassado.devolvePorIdTratamento(id_tratamento_passado);

                // Propaga dados, previamente inseridos, pela sessao
                session.setAttribute("id_tratamento", id_tratamento_passado);
                session.setAttribute("id_pessoa", id_pessoa);

                session.setAttribute("data_ano", UtensiliosParaDatas.devolveAnoDaData(tratamento_passado.getData()));
                session.setAttribute("data_mes", UtensiliosParaDatas.devolveMesDaData(tratamento_passado.getData()));
                session.setAttribute("data_dia", UtensiliosParaDatas.devolveDiaDaData(tratamento_passado.getData()));

                session.setAttribute("descricao", tratamento_passado.getDescricao());
                session.setAttribute("observacao", tratamento_passado.getObservacao());

                response.sendRedirect("/altera_tratamento_passado.jsp");
            } else if (sub_accao != null && sub_accao.equals("segunda")) {
                if (dadosEstaoValidos(request, GestorDeUtentes.ALTERAR_TRATAMENTO_PASSADO)) {

                    TratamentoPassado dados_do_tratamento_passado = populaTabelaAlterarTratamentoPassado(request);
                    dados_do_tratamento_passado.setId(Long.parseLong(request.getParameter("id")));

                    Long id_pessoa = Long.parseLong(request.getParameter("id_pessoa"));

                    boolean temConta = Pessoa.temContaDeUtilzador(id_pessoa);

                    if (temConta) {
                        Pessoa cliente_particular = ClienteParticular.devolve(id_pessoa);
                        cliente_particular.alteraTratamentoPassado(dados_do_tratamento_passado);
                        session.setAttribute("particular", cliente_particular);
                    } else {
                        Pessoa membro_do_agregado = MembroDoAgregado.devolve(id_pessoa);
                        membro_do_agregado.alteraTratamentoPassado(dados_do_tratamento_passado);
                        session.setAttribute("membro", membro_do_agregado);
                    }
                    session.setAttribute("erros", null);

                    session.setAttribute("msg_sucesso", "Tratamento passado alterado com sucesso.");
                    session.setAttribute("nome_pagina_link", "dos dados pessoais");
                    session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_pessoa);
                    response.sendRedirect("/mostra_sucesso.jsp");
                } else {
                    session.setAttribute("erros", devolveTabelaDeErrosParaAlterarTratamentoPassado(request));
                    session.setAttribute("descricao", request.getParameter("descricao"));
                    session.setAttribute("observacao", request.getParameter("observacao"));
                    response.sendRedirect("/altera_tratamento_passado.jsp");
                }
            } else {
                session.setAttribute("excepcao", "Url incorrecto.");
                response.sendRedirect("/mostra_erro.jsp");
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.ALTERAR_TRATAMENTO_PASSADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    public void removerTratamentoPassado(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {
            Long id_tratamento_passado = Long.parseLong((String) request.getParameter("id"));
            Long id_titular = Long.parseLong(request.getParameter("titular"));


            String perfil = ContaDeUtilizador.devolvePerfil(id_titular);

            //Notta: deveria ser verificado se � membro do agregado
            if (perfil == null) {
                perfil = "membro_do_agregado";
            }

            if (perfil.equals("cliente_particular")) {
                Pessoa cliente_particular = ClienteParticular.devolve(id_titular);
                cliente_particular.removeTratamentoPassado(id_tratamento_passado);


                session.setAttribute("cliente_particular", cliente_particular);
//            }
//            else if (perfil.equals("cliente_empresa")) {
//                Pessoa cliente_empresa = ClienteEmpresa.devolve(id_titular);
//                cliente_empresa.removeTratamentoPassado(id_tratamento_passado);
//
//
//                session.setAttribute("cliente_empresa", cliente_empresa);
            } else if (perfil.equals("membro_do_agregado")) {
                Pessoa membro_do_agregado = MembroDoAgregado.devolve(id_titular);
                membro_do_agregado.removeTratamentoPassado(id_tratamento_passado);


                session.setAttribute("membro_do_agregado", membro_do_agregado);
            }

            //response.sendRedirect("Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_titular);
            session.setAttribute("msg_sucesso", "Tratamento passado removido com sucesso.");
            session.setAttribute("nome_pagina_link", "dos dados pessoais");
            session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_titular);
            response.sendRedirect("/mostra_sucesso.jsp");

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_TRATAMENTO_PASSADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    public void removerTratamentosPassados(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {


            String[] ids_tratamento_passado_a_remover = request.getParameterValues("tratamentos_passados");
            Long id_titular = Long.parseLong(request.getParameter("titular"));




            // REVER by tshuba




            if (ids_tratamento_passado_a_remover != null) {
                for (String tratamento_passado_string : ids_tratamento_passado_a_remover) {
                    Long id_tratamento_passado = Long.parseLong(tratamento_passado_string);


                    String perfil = ContaDeUtilizador.devolvePerfil(id_titular);


                    //Notta: deveria ser verificado se � membro do agregado
                    if (perfil == null) {
                        perfil = "membro_do_agregado";
                    }


                    if (perfil.equals("cliente_particular")) {
                        Pessoa cliente_particular = ClienteParticular.devolve(id_titular);
                        cliente_particular.removeTratamentoPassado(id_tratamento_passado);
                        session.setAttribute("utilizador", cliente_particular);
//                    } else if (perfil.equals("cliente_empresa")) {
//                        Pessoa cliente_empresa = ClienteEmpresa.devolve(id_titular);
//                        cliente_empresa.removeTratamentoPassado(id_tratamento_passado);
//                        session.setAttribute("utilizador", cliente_empresa);
                    } else if (perfil.equals("membro_do_agregado")) {
                        Pessoa membro_do_agregado = MembroDoAgregado.devolve(id_titular);
                        membro_do_agregado.removeTratamentoPassado(id_tratamento_passado);
                        session.setAttribute("utilizador", membro_do_agregado);
                    }
                }
            }


            //response.sendRedirect("Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_titular);
            session.setAttribute("msg_sucesso", "Tratamentos passados removidos com sucesso.");
            session.setAttribute("nome_pagina_link", "dos dados pessoais");
            session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_titular);
            response.sendRedirect("/mostra_sucesso.jsp");

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_TRATAMENTOS_PASSADOS);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    public void removerHistoricoInternamento(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {
            Long id_internamento = Long.parseLong((String) request.getParameter("id"));
            Long id_pessoa = Long.parseLong((String) request.getParameter("titular"));
            Hospital.removeHistoricoInternamento(id_internamento);


            session.setAttribute("msg_sucesso", "Internamento removido com sucesso do hist�rico.");
            session.setAttribute("nome_pagina_link", "dos dados pessoais");
            session.setAttribute("pagina_link", "Gestor?gestor=gestor_de_utentes&accao=visualizar_cliente&id=" + id_pessoa);
            response.sendRedirect("/mostra_sucesso.jsp");



        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_HISTORICO_INTERNAMENTO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    public void removeMensagem(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {
            Long id_mensagem = Long.parseLong((String) request.getParameter("id_mensagem"));


            Hospital.removeMensagem(id_mensagem);


            session.setAttribute("msg_sucesso", "Mensagem removida com sucesso.");
            session.setAttribute("nome_pagina_link", "�rea do cliente");
            session.setAttribute("pagina_link", "/area_cliente.jsp");
            response.sendRedirect("/mostra_sucesso.jsp");



        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.REMOVER_HISTORICO_INTERNAMENTO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    public void visualizarTratamentoPassado(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        try {
            Long id = Long.parseLong(request.getParameter("id"));
            LinkedList<TratamentoPassado> tratamento_passado = TratamentoPassado.devolvePorIdPessoa(id);

            session.setAttribute("tratamento_passado", tratamento_passado);
            response.sendRedirect("/visualizar_tratamento_passado.jsp");

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Ocorreu um erro no..." + GestorDeUtentes.VISUALIZAR_TRATAMENTO_PASSADO);
            session.setAttribute("excepcao", e.toString());
            response.sendRedirect("/mostra_erro.jsp");
        }
    }

    private TratamentoPassado populaTabelaInserirTratamentoPassado(final HttpServletRequest request) throws NoSuchAlgorithmException {

        int ano = Integer.parseInt(request.getParameter("data_ano"));
        int mes = Integer.parseInt(request.getParameter("data_mes"));
        int dia = Integer.parseInt(request.getParameter("data_dia"));
        Date data = UtensiliosParaDatas.devolveData(ano, mes, dia);

        String descricao = request.getParameter("descricao");
        String observacao = request.getParameter("observacao");
        Long id = Long.parseLong(request.getParameter("id"));

        return new TratamentoPassado(id, data, descricao, observacao);
    }

    private TratamentoPassado populaTabelaAlterarTratamentoPassado(final HttpServletRequest request) throws NoSuchAlgorithmException {

        /* int ano = Integer.parseInt(request.getParameter("data_ano"));
        int mes = Integer.parseInt(request.getParameter("data_mes"));
        int dia = Integer.parseInt(request.getParameter("data_dia"));
        // Date data = UtensiliosParaDatas.devolveData(ano, mes, dia);*/
        Date data = UtensiliosParaDatas.devolveData(2000, 1, 1);

        String descricao = request.getParameter("descricao");
        String observacao = request.getParameter("observacao");
        Long id_pessoa = Long.parseLong(request.getParameter("id_pessoa"));

        return new TratamentoPassado(id_pessoa, data, descricao, observacao);
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaInserirTratamentoPassado(final HttpServletRequest request) throws SQLException,
            ClassNotFoundException, InstantiationException, IllegalAccessException {


        Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();


        // Propaga dados, previamente inseridos, pela sessao
        // Data
        String data_ano = (String) request.getParameter("data_ano");
        if (data_ano == null || data_ano.trim().equals("")) {
            tabela_de_erros.put("data_ano", "Ano: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_ano)) {
            tabela_de_erros.put("data_ano", "O campo ano da data deverá ser numérico.");
        }


        String data_mes = (String) request.getParameter("data_mes");
        if (data_mes == null || data_mes.trim().equals("")) {
            tabela_de_erros.put("data_mes", "Mês: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_mes)) {
            tabela_de_erros.put("data_mes", "O campo mês da data deverá ser numérico.");
        }


        String data_dia = (String) request.getParameter("data_dia");
        if (data_dia == null || data_dia.trim().equals("")) {
            tabela_de_erros.put("data_dia", "Dia: Campo Obrigatório. Não pode estar vazio.");
        } else if (!UtensiliosParaStrings.eUmNumero(data_dia)) {
            tabela_de_erros.put("data_dia", "O campo dia da data deverá ser numérico.");
        }


        if (data_ano != null && !data_ano.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_ano) && data_mes != null && !data_mes.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_mes) && data_dia != null && !data_dia.trim().equals("") && UtensiliosParaStrings.eUmNumero(data_dia)) {
            int ano = Integer.parseInt(data_ano);
            int mes = Integer.parseInt(data_mes);
            int dia = Integer.parseInt(data_dia);
            if (!UtensiliosParaDatas.eValida(ano, mes, dia)) {
                tabela_de_erros.put("data", "Formato de Data Errado.");
            }
        }


        String descricao = (String) request.getParameter("descricao");
        if (descricao == null || descricao.trim().equals("")) {
            tabela_de_erros.put("descricao", "Campo Obrigatório. Não pode estar vazio.");
        }


        String observacao = (String) request.getParameter("observacao");
        if (observacao == null || observacao.trim().equals("")) {
            tabela_de_erros.put("observacao", "Campo Obrigatório. Não pode estar vazio.");
        }


        return tabela_de_erros;
    }

    private Hashtable<String, String> devolveTabelaDeErrosParaAlterarTratamentoPassado(final HttpServletRequest request) {
        Hashtable<String, String> tabela_de_erros = new Hashtable<String, String>();


        String descricao = (String) request.getParameter("descricao");
        if (descricao == null || descricao.trim().equals("")) {
            tabela_de_erros.put("descricao", "Campo Obrigatório. Não pode estar vazio.");
        }


        String observacao = (String) request.getParameter("observacao");
        if (observacao == null || observacao.trim().equals("")) {
            tabela_de_erros.put("observacao", "Campo Obrigatório. Não pode estar vazio.");
        }


        return tabela_de_erros;
    }
    // UTENTE
    public static final String PESQUISAR_UTENTE = "pesquisar_utente";
    public static final String VERIFICAR_BI = "verifica_bi";
    public static final String MIGRA_UTILIZADOR = "migra_utilizador";
    // CLIENTE
    public static final String INSERIR_CLIENTE = "inserir_cliente";
    public static final String ALTERAR_CLIENTE = "alterar_cliente";
    public static final String REMOVER_CLIENTE = "remover_cliente";
    public static final String VISUALIZAR_CLIENTE = "visualizar_cliente";
    // MEMBRO DO AGREGADO
    public static final String ADICIONAR_MEMBRO_DO_AGREGADO = "adicionar_membro_do_agregado";
    public static final String ALTERAR_MEMBRO_DO_AGREGADO = "alterar_membro_do_agregado";
    public static final String REMOVER_MEMBRO_DO_AGREGADO = "remover_membro_do_agregado";
    public static final String REMOVER_MEMBROS_DO_AGREGADO = "remover_membros_do_agregado";
    public static final String VISUALIZAR_MEMBRO_DO_AGREGADO = "visualizar_membro_do_agregado";
    public static final String MIGRA_MEMBRO_DO_AGREGADO = "migrar_membro_do_agregado";
    // DOENCA GENERICA
    public static final String ADICIONAR_DOENCA_GENERICA = "adicionar_doenca_generica";
    public static final String ALTERAR_DOENCA_GENERICA = "alterar_doenca_generica";
    public static final String REMOVER_DOENCA_GENERICA = "remover_doenca_generica";
    public static final String REMOVER_DOENCAS_GENERICAS = "remover_doencas_genericas";
    public static final String VISUALIZAR_DOENCA_GENERICA = "visualizar_doenca_generica";
    // DOENCA PASSADA
    public static final String ADICIONAR_DOENCA_PASSADA = "adicionar_doenca_passada";
    public static final String ALTERAR_DOENCA_PASSADA = "alterar_doenca_passada";
    public static final String REMOVER_DOENCA_PASSADA = "remover_doenca_passada";
    public static final String REMOVER_DOENCAS_PASSADAS = "remover_doencas_passadas";
    public static final String VISUALIZAR_DOENCA_PASSADA = "visualizar_doenca_passada";
    // TRATAMENTO PASSADO
    public static final String ADICIONAR_TRATAMENTO_PASSADO = "adicionar_tratamento_passado";
    public static final String ALTERAR_TRATAMENTO_PASSADO = "alterar_tratamento_passado";
    public static final String REMOVER_TRATAMENTO_PASSADO = "remover_tratamento_passado";
    public static final String REMOVER_TRATAMENTOS_PASSADOS = "remover_tratamentos_passados";
    public static final String VISUALIZAR_TRATAMENTO_PASSADO = "visualizar_tratamento_passado";
    public static final String REMOVER_HISTORICO_INTERNAMENTO = "remover_historico_internamento";
    public static final String PESQUISAR_COLABORADOR = "pesquisar_colaborador";
    public static final String REMOVER_MENSAGEM = "remover_mensagem";

    private Utente populaTabelaInserirMembro(HttpServletRequest request) {

        Long id_titular = Long.getLong(request.getParameter("id_titular"));
        String nome = request.getParameter("nome");
        char sexo = request.getParameter("sexo").charAt(0);
        int bi = Integer.parseInt(request.getParameter("bi"));

        // Data de Nascimento
        Date data = UtensiliosParaDatas.devolveDataEmDate(UtensiliosParaDatas.devolveDataEmString(Integer.parseInt(request.getParameter("data_de_nascimento_ano")),
                Integer.parseInt(request.getParameter("data_de_nascimento_mes")),
                Integer.parseInt(request.getParameter("data_de_nascimento_dia"))));

        int nif = Integer.parseInt(request.getParameter("nif"));
        String email = request.getParameter("email");
        int telefone = Integer.parseInt(request.getParameter("telefone"));
        int telemovel = Integer.parseInt(request.getParameter("telemovel"));
        String morada = request.getParameter("morada");
        String sangue = request.getParameter("grupo_sanguineo");

        int prefixo_codigo_postal = Integer.parseInt(request.getParameter("prefixo_codigo_postal"));
        int sufixo_codigo_postal = Integer.parseInt(request.getParameter("sufixo_codigo_postal"));
        if (!CodigoPostal.existe(prefixo_codigo_postal, sufixo_codigo_postal)) {
            CodigoPostal.insere(populaTabelaCodigoPostal(request));
        }

        Long codigo = CodigoPostal.devolve(prefixo_codigo_postal, sufixo_codigo_postal).getIdCodigoPostal();
        return null;
        //return new Pessoa(nome, sexo, bi, data, nif, email, telefone, telemovel, morada, sangue, codigo);
    }

    private void migraMembroDoAgregado(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException, NoSuchAlgorithmException {

        Pessoa p = Pessoa.devolve((Long) session.getAttribute("id_pessoa"));
        Cliente c = new Cliente(p.getIdPessoa());
        String password = Seguranca.converteParaMD5(request.getParameter("password"));
        ContaDeUtilizador cu = new ContaDeUtilizador(request.getParameter("username"), password, "1");
        cu.setPerfil("particular");
        cu.setIdPessoa(p.getIdPessoa());

        Cliente.insere(c);
        ContaDeUtilizador.insere(cu);

        session.setAttribute("msg_sucesso", "Migração efectuado com sucesso.");
        session.setAttribute("nome_pagina_link", "de login");
        session.setAttribute("pagina_link", "/login.jsp");
        response.sendRedirect("/mostra_sucesso.jsp");

    }
}
